如何以posix兼容的方式获得最大信号数?

时间:2015-09-06 20:09:33

标签: posix glibc

更新:整个问题出现问题,我的c ++代码中出现语法错误。

在Linux上我找到了

#define _NSIG            64
<{1>}中的

,但我认为包括那将不是一个真正符合标准的解决方案。

glibc中的

asm-generic/signal.h使用了这个signal.h定义,但是它隐藏在include-define-undef-ifdef和类似的预处理器命令的复杂结构之后,并且它不是一个可见的符号。简单_NSIG

我只是想找到一种方法来找到我可以给#include <signal.h>和类似信号处理api调用的最大值,包括实时信号。这有可能吗?

2 个答案:

答案 0 :(得分:5)

POSIX.1-2001标准要求SIGRTMINSIGRTMAX的定义。在linux上,它们是使用_NSIG定义的。

要符合POSIX标准,请使用上述定义,而不是直接使用_NSIG

#include <stdio.h>
#include <signal.h>

int main() {
  printf("%lu\n", SIGRTMAX);
  return 0;
}

使用gcc main.cpp

编译时,在我的系统上打印64

答案 1 :(得分:1)

POSIX不提供最大信号编号。最后一个将NSIG添加到POSIX的提案似乎都失败了。

2017年5月来自http://austingroupbugs.net/view.php?id=1138

  

joerg:为了使便携式shell实现更容易,如果标准还添加了一个&#34; NSIG&#34;那么这将是一个好主意。可以重定向到getconf()调用的定义。

     

kre: NSIG没有用,除非我们也对信号数字所用的值做出假设,比如它们来自标准避免做的1..NSIG(并且应该继续做) 。)

它不是POSIX,但许多程序都假设信号从1到某个最大数字。 Matz's Ruby uses this C code

#ifndef NSIG
# define NSIG (_SIGMAX + 1)      /* For QNX */
#endif
signal.h中的

4.2BSD defined NSIG,使得NSIG-1是最大信号数。我猜大多数其他POSIX系统都从BSD中获取了NSIG,尽管NSIG从未成为POSIX的一部分。 Ruby在许多POSIX系统上运行,对于没有NSIG的系统,只需要这3行。