为什么 `kill -l` 没有列出 32 和 33 的信号号?

为什么 `kill -l` 没有列出 32 和 33 的信号号?

kill -l在linux上执行会得到:

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

32和发生了什么33?为什么没有列出?他们本可以从 1 开始,以 62 结束,而不是在中间跳过 2?

答案1

正是因为非专利技术。由于它是GNU C 库几乎每个现代 Linux 发行版都不再使用前两个实时信号。 NPTL 是一个实现POSIX 线程。 NPTL 在内部使用前两个实时信号。

这部分的信号手册页很有趣:

Linux 内核支持 33 种不同的实时信号,编号为 32 到 64。但是,glibc POSIX 线程实现内部使用两个(对于 NPTL)或三个(对于 LinuxThreads)实时信号(请参阅并行线程(7)),并调整值SIGRTMIN适当地(至 34 或 35)。由于可用实时信号的范围根据 glibc 线程实现而变化(并且根据可用内核和 glibc,这种变化可能在运行时发生),并且实际上实时信号的范围在不同 UNIX 系统中也有所不同,因此程序应该切勿使用硬编码数字引用实时信号,但应始终使用符号来引用实时信号SIGRTMIN+n,并包括适当的(运行时)检查 SIGRTMIN+n 不超过信号最大值

我还检查了glibc的源代码;看22号线__SIGRTMIN增加+2,因此前两个实时信号被排除在实时信号范围之外。

答案2

因为信号是:

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 

Linux 中都不支持这两者。 (LWP 代表轻量化工艺

来源:IBM DeveloperWorks Solaris 到 Linux 移植指南

相关内容