32和33杀号发生了什么?

如果在bash中输入kill -l并探测信号的数量。

32和33杀号发生了什么?


POSIX实时信号选项定义了一组SIGRTMINSIGRTMAX的信号,它们具有各种有用的属性(例如,它们具有定义明确的传送优先级 - 最低信号数 - 同一信号的多个实例可以排队并关联带一个参数,通过sigqueue() )。 这些由内核使用32以上的信号编号实现。

但是,POSIX不需要SIGRTMINSIGRTMAX作为用户代码的编译时常量,而在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

这证实了SIGRTMINSIGRTMAX是最大的信号并且都具有32值。

更多关于man 7 signals

链接地址: http://www.djcxy.com/p/11251.html

上一篇: What has happened to the 32 and 33 kill signals?

下一篇: IoC Windows Service Architecture