Linux-Kernel

為什麼 SIGRTMIN(第一個實時信號)的整數值是 34 而不是 32?

  • March 16, 2020

檢查kill -l命令的輸出

$ kill -l
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

可以注意到 SIGRTMIN 的整數值是 34,而不是 32。

... 31) SIGSYS 34) SIGRTMIN ...

為什麼?

$ uname -r
4.19.0-8-amd64

$ ls -l /lib/x86_64-linux-gnu/libc-2.28.so 
-rwxr-xr-x 1 root root 1.8M May  1  2019 /lib/x86_64-linux-gnu/libc-2.28.so*

這個問題的答案可以在signal(7)手冊頁的Real-time Signals部分中找到

實時信號

Linux 支持最初在 POSIX.1b 實時擴展中定義的實時信號(現在包含在 POSIX.1-2001 中)。支持的實時信號範圍由宏SIGRTMINSIGRTMAX. POSIX.1-2001 要求實現至少支持POSIX_RTSIG_MAX(8)實時信號。

Linux 核心支持 32 種不同的實時信號,編號3364. 但是,glibcPOSIX 執行緒實現在內部使用兩個(對於 NPTL)或三個(對於 LinuxThreads)實時信號(請參閱 參考資料pthreads(7)),並SIGRTMIN適當地調整 (to3435)的值。

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