9

如果您输入kill -lbash 并探测信号数。

32 和 33 杀戮信号发生了什么?

4

2 回答 2

2

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

但是 POSIX 不需要SIGRTMIN并且SIGRTMAX是用户级代码的编译时常量,而在 GNU libc 中它们不是:如果您使用用户级<signal.h>通过预处理器(例如使用gcc -E)放置源文件,您会看到实际上SIGRTMIN扩展到(__libc_current_sigrtmin()).

在 glibc 内部的实现至少保留了内核支持的前两个值,用于其内部目的。第一个(最高优先级的信号)用于支持线程取消处理;第二个用于与setuid. (见这里。我不确定在什么情况下使用分配更多信号供内部使用的能力。)

因此,丢失的信号编号是由于向bash您显示了应用程序对可用信号的视图(忽略了 glibc 内部使用的信号),而不是内核的视图。

于 2012-10-02T00:22:27.117 回答
1

这不是 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

于 2012-10-01T20:46:55.987 回答