32和33杀号发生了什么?
如果在bash中输入kill -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