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
上一篇: 为什么qmap使用skiplist而不是ob rb
下一篇: 32和33杀号发生了什么?