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

use*_*595 21 linux kill signals

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
Run Code Online (Sandbox Code Playgroud)

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

cha*_*aos 21

这是因为NPTL。由于它是GNU C 库的一部分,几乎每个现代 linux 发行版都不再使用前两个实时信号。NPTL 是POSIX 线程的实现。NPTL 在内部使用前两个实时信号。

信号手册的这部分非常有趣:

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

我还检查了 glibc 的源代码;见第 22 行__SIGRTMIN增加+2,所以前两个实时信号被排除在实时信号范围之外。


gar*_*Red 11

因为信号是:

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 
Run Code Online (Sandbox Code Playgroud)

Linux 不支持这两者。(LWP 代表LightWeight Process

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