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 代表轻量化工艺)