Linux

為什麼 kill -l 沒有列出 32 和 33 的信號編號?

  • September 16, 2014

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?

這是因為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,因此前兩個實時信號被排除在實時信號範圍之外。

引用自:https://unix.stackexchange.com/questions/155829