What happened to 32 and 33 kill signals?

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

What happened to 32 and 33 kill signals?

+8
linux bash kill
source share
2 answers

This is not Centos. 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, over 31 always the same SIGRTMAX signal with some options.

In addition, in 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 

This confirms that SIGRTMIN and SIGRTMAX are the largest signals and have a value of 32 .

Additional information about signals in man 7 signals

+2
source share

The POSIX parameter realtime signals defines a set of signals from SIGRTMIN to SIGRTMAX that have various useful properties (for example, they have a clearly defined delivery priority - the lowest signal number) and several instances of the same signal can be queued and connected to the parameter via sigqueue() ). They are implemented by the kernel using signal numbers 32 up.

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

implementing this inside glibc reserves at least the first two values ​​supported by the kernel for its own internal purposes. The first one (the highest priority of such a signal) is used to support stream cancel processing; the second is used for something related to the setuid implementation. (See here . I am not sure what circumstances take advantage of the possibility of allocating additional signals for internal use.)

Thus, the missing signal numbers are due to the fact that bash shows you the application view of the available signals (which omits those used internally with glibc), and not the kernel view.

+2
source share

All Articles