在linux上执行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
32
和33
怎么了?为什么没有列出来?他们可以在1点开始,62点结束,而不是在中间跳2次?
发布于 2014-09-16 10:23:17
这是因为NPTL。由于它是GNU库的一部分,几乎所有现代的linux发行版都不再使用前两个实时信号。NPTL是POSIX线程的一个实现。NPTL内部利用前两个实时信号.
信号指令的这一部分非常有趣:
Linux内核支持32种不同的实时信号,编号为33到64.但是,glibc线程内部使用两个( NPTL)或三个( LinuxThreads)实时信号(请参阅POSIX (7)),并适当地调整SIGRTMIN的值(为34或35)。由于可用实时信号的范围因glibc线程实现而异(根据可用内核和glibc在运行时可以发生这种变化),而且实时信号的范围在UNIX系统中也会有所不同,所以程序不应该使用硬编码数字来引用实时信号,而是应该始终使用表示法SIGRTMIN+n来引用实时信号,并包括适当的(运行时)检查,以确保SIGRTMIN+n不超过SIGRTMAX。
我还检查了glibc的源代码;参见第22行。__SIGRTMIN
增加+2,因此前两个实时信号被排除在实时信号的范围之外。
发布于 2014-09-16 09:34:23
因为信号是:
SIGWAITING 32 Ignore All LWPs blocked
SIGLWP 33 Ignore Virtual Interprocessor Interrupt for Threads Library
在Linux中这两种都不支持。(LWP代表轻量级过程)
https://unix.stackexchange.com/questions/155829
复制相似问题