为什么`kill -l`不列出信号号32和33?


18

kill -l在linux上执行可以得到:

 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

发生了什么事32,并33?为什么未列出?他们本可以从1开始到62结束,而不是在中间跳过2?


PS没有“错误代码”-它们是信号编号。
G-Man说'Resstate Monica'2014/

Answers:


20

这是因为NPTL。由于它是GNU C库的一部分,几乎每个现代linux发行版都不再使用前两个实时信号。NPTL是POSIX线程的实现。NPTL内部使用前两个实时信号。

信号手册的这一部分非常有趣:

Linux内核支持32种不同的实时信号,范围从33到64。但是,glibc POSIX线程实现内部使用两个(对于NPTL)或三个(对于LinuxThreads)实时信号(请参阅pthreads(7))。 ,并适当调整SIGRTMIN的值(至34或35)。因为可用的实时信号的范围根据glibc线程实现的不同而有所不同(并且这种变化可能会在运行时根据可用的内核和glibc发生),并且实际上,实时信号的范围在UNIX系统上也有所不同,所以程序应不要使用硬编码数字引用实时信号,而应该使用SIGRTMIN + n引用实时信号,并包括适当的(运行时)检查,以确保SIGRTMIN + n不超过SIGRTMAX。

我还检查了glibc的源代码。参见第22行__SIGRTMIN增加了+2,因此前两个实时信号被排除在实时信号范围之外。


那么,如何在一段执行代码中在运行时获得 SIGRTMIN的当前值?
SlySven '16

10

因为信号是:

SIGWAITING 32 Ignore All LWPs blocked 
    SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library 

Linux都不支持。(LWP代表“ 轻量工艺”

来源:IBM DeveloperWorks Solaris到Linux的移植指南


Linux的有信号32和33参见:unixhelp.ed.ac.uk/CGI/man-cgi?signal+7Real-time Signals部分。
cuonglm

@Gnouc-根据kill -l RTMIN开始于34,而不是您引用的文档中的32。这个说它从33开始,但是接着说你不应该用数字引用它们,因为数字可能会根据glibc线程实现的不同而变化。
garethTheRed 2014年

当然,它会因系统而异,但是术语“不支持Linux”是不正确的。您可以参考以下文件:cse.psu.edu/~dheller/cmpsc311/Lectures/Process-Control-Signals/…。也许我们需要一位曾在Linux上工作很久的Vereran,以便让我们知道信号32、33会发生什么。为什么没有对此进行记录。
cuonglm

它们由RT pthread库在内部使用-过去只有三个而不是两个,因为不同的系统出于内部目的使用了很多。从编码的角度来看,您不应该对SIGSYS以上的信号使用编译时常量,例如SIGRTMIN带有#define行的集合,因为该数字在以后运行可执行文件时可能会发生变化。如果针对一个pthread库编译的应用程序在已与另一个pthread库一起编译的系统上运行,那么几年前两个pthread库都在使用时就会出现这种情况!
SlySven '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.