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