如果您输入kill -l
bash 并探测信号数。
32 和 33 杀戮信号发生了什么?
POSIX 实时信号选项定义了一组具有各种有用属性的信号SIGRTMIN
(例如SIGRTMAX
,它们具有明确定义的传递优先级——最低信号号优先——并且同一信号的多个实例可以排队,并与参数,通过sigqueue()
)。这些是由内核使用信号编号 32 向上实现的。
但是 POSIX 不需要SIGRTMIN
并且SIGRTMAX
是用户级代码的编译时常量,而在 GNU libc 中它们不是:如果您使用用户级<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
,但有一些变化。
此外,在/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