如果在bash中inputkill -l
并探测信号的数量。
32和33杀号发生了什么?
POSIX实时信号选项定义了从SIGRTMIN
到SIGRTMAX
一组信号,它们具有各种有用的属性(例如,它们具有定义明确的传送优先级 – 最低的信号数量 – 同一信号的多个实例可以排队,并且关联带一个参数,通过sigqueue()
)。 这些由内核使用信号编号32向上执行。
但POSIX不需要SIGRTMIN
和SIGRTMAX
作为用户代码的编译时常量,在GNU libc中它们不是:如果通过预处理程序(例如,使用user-land <signal.h>
用gcc -E
),你会发现SIGRTMIN
实际上扩展为(__libc_current_sigrtmin())
。
内部glibc的实现 至少保留了内核支持的前两个值,用于内部目的。 其中第一个(最高优先级的信号)用于支持线程取消处理; 第二个用于与setuid
的实现有关的东西。 (请看这里 ,我不确定在什么情况下使用了分配更多信号供内部使用的能力。)
所以丢失的信号数字是由于bash
向您展示了应用程序对可用信号(忽略glibc内部使用的信号)的看法,而不是内核的视图。
这不是Centos的重点。 在archlinux上我有:
$ 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
正如你所看到的, 31
以上的信号总是和SIGRTMAX
有一些变化的信号SIGRTMAX
。
而且,在源文件/usr/include/asm/signal.h
我们发现:
#define NSIG 32 typedef unsigned long sigset_t; #endif /* __ASSEMBLY__ */ #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGABRT 6 #define SIGIOT 6 #define SIGBUS 7 #define SIGFPE 8 #define SIGKILL 9 #define SIGUSR1 10 #define SIGSEGV 11 #define SIGUSR2 12 #define SIGPIPE 13 #define SIGALRM 14 #define SIGTERM 15 #define SIGSTKFLT 16 #define SIGCHLD 17 #define SIGCONT 18 #define SIGSTOP 19 #define SIGTSTP 20 #define SIGTTIN 21 #define SIGTTOU 22 #define SIGURG 23 #define SIGXCPU 24 #define SIGXFSZ 25 #define SIGVTALRM 26 #define SIGPROF 27 #define SIGWINCH 28 #define SIGIO 29 #define SIGPOLL SIGIO /* #define SIGLOST 29 */ #define SIGPWR 30 #define SIGSYS 31 #define SIGUNUSED 31 /* These should not be considered constants from userland. */ #define SIGRTMIN 32 #define SIGRTMAX _NSIG
这证实了SIGRTMIN
和SIGRTMAX
是最大的信号,并且都是32
值。
man 7 signals
更多信息