What has happened to the 32 and 33 kill signals?

If you enter kill -l in bash and probe number of signals.

What has happened to the 32 and 33 kill signals?


The POSIX realtime signals option defines a set of signals from SIGRTMIN to SIGRTMAX which have various useful properties (eg they have a well-defined delivery priority -- lowest signal number first -- and multiple instances of the same signal can be queued, and associated with a parameter, via sigqueue() ). These are implemented by the kernel using signal numbers 32 upwards.

But POSIX does not require SIGRTMIN and SIGRTMAX to be compile-time constants for user-land code, and in the GNU libc they are not: if you put a source file using the user-land <signal.h> through the preprocessor (eg with gcc -E ), you'll see that SIGRTMIN actually expands to (__libc_current_sigrtmin()) .

The implementation of this inside glibc reserves at least the first two values supported by the kernel for its own internal purposes. The first of those (the highest priority such signal) is used to support thread cancellation handling; the second is used for something related to the implementation of setuid . (See here. I'm not sure what circumstances make use of the ability to allocate further signals for internal use.)

So the missing signal numbers are due to bash showing you an application's view of the available signals (which omits those used internally by glibc), rather than the kernel's view.


This is not Centos focused. On archlinux I have :

$ 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

As you can see, what's over 31 is always the same signal SIGRTMAX with some variations.

Moreover, on the source file /usr/include/asm/signal.h we found :

#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

That confirms that SIGRTMIN & SIGRTMAX are the biggest signals and have the 32 value both.

More infos on signals in man 7 signals

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

上一篇: 为什么qmap使用skiplist而不是ob rb

下一篇: 32和33杀号发生了什么?