继续阅读,signal(7)
我现在可以看到:两个,但曾经:三个;超过 31 的信号编号保留供实时信号系统使用,不应使用:
实时信号
Linux 支持最初在 POSIX.1b 实时扩展中定义的实时信号(现在包含在 POSIX.1-2001 中)。支持的实时信号的范围由宏
SIGRTMIN
和定义SIGRTMAX
。 POSIX.1-2001 要求实现至少支持POSIX_RTSIG_MAX(8)
实时信号。Linux 内核支持 32 个不同的实时信号,编号为 33 到 64。但是,
glibc
POSIX 线程实现内部使用两个(对于 NPTL)或三个(对于 LinuxThreads)实时信号(参见 参考资料pthreads(7)
),并调整值适当SIGRTMIN
地(至34或35)。由于可用实时信号的范围根据glibc
线程实现而变化(并且根据可用内核和 glibc,这种变化可能在运行时发生),并且实际上实时信号的范围在不同的 UNIX 系统中也有所不同,因此程序应该切勿使用硬编码数字引用实时信号,但应始终使用符号 来引用实时信号,并包括不超过 的SIGRTMIN+n
适当(运行时)检查。SIGRTMIN+n
SIGRTMAX
那么,当程序运行时,如何确定 SIGRTMIN 的值(在需要为其自身和任何子级设置信号处理的 C 程序中)?我已经查看了这里的问题和答案,但他们似乎都认为SIGRTMIN
这是页面说不应该这样做的#define SIGRTMIN 34
时候!man
答案1
#define
我愚蠢地忘记了,除非那样写,否则 d的东西不是恒定的!
正如 @RuiFRibeiro 在 中指出的/usr/include/
特定于架构的/bits/signum.h
底部的包含文件是一对提供所需内容的宏:
#define SIGUNUSED 31
#define _NSIG 65 /* Biggest signal number + 1
(including real-time signals). */
#define SIGRTMIN (__libc_current_sigrtmin ())
#define SIGRTMAX (__libc_current_sigrtmax ())
/* These are the hard limits of the kernel. These values should not be
used directly at user level. */
#define __SIGRTMIN 32
#define __SIGRTMAX (_NSIG - 1)
所以现在我知道如何防止信号处理程序被尝试替换为那些保留的信号处理程序 - 我怀疑任何尝试都会被拒绝,但对于错误报告,最好知道限制是什么,而不是通过吸吮来确定它们并查看方法!