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

How to get the maximal signal number on a posix-compatible way?

更新:整个问题都在一条错误的线上,这是我的 c++ 代码中的语法错误。

在 Linux 我找到了

#define _NSIG            64

asm-generic/signal.h 中,但我认为包含它并不是真正符合标准的解决方案。

signal.h 在 glibc 中使用这个 _NSIG 定义,但它隐藏在 include-define-undef-ifdef 和类似预处理器命令的复杂结构后面,并且它不是可见符号经过简单的 #include <signal.h>.

我只是在寻找一种方法来找到我可以给 sigaction 和类似信号处理 api 调用的最大符号,包括实时信号。有可能吗?

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

POSIX没有提供最大信号数。上次将 NSIG 添加到 POSIX 的提议似乎失败了。

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

joerg: For making portable shell implementations easier, it would be a good idea if the standard also adds a "NSIG" definition that may redirect to a getconf() call.

kre: NSIG is not useful unless we also make assumptions about the values used for the signal numbers, like that they are from 1..NSIG which the standard avoids doing (and should continue to do.)

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

#ifndef NSIG
# define NSIG (_SIGMAX + 1)      /* For QNX */
#endif

4.2BSD defined NSIG in signal.h,这样 NSIG - 1 就是最大信号数。我猜大多数其他 POSIX 系统都从 BSD 获取了 NSIG,尽管 NSIG 从来不是 POSIX 的一部分。 Ruby 在许多 POSIX 系统上运行,对于没有 NSIG 的系统只需要这 3 行。