【问题标题】:How to get the maximal signal number on a posix-compatible way?如何以 posix 兼容的方式获得最大信号数?
【发布时间】:2015-12-02 08:49:12
【问题描述】:

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

在 Linux 上我发现了

#define _NSIG            64

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

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

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

【问题讨论】:

  • POSIX.1-2001 要求定义 SIGRTMINSIGRTMAX 并且实现至少支持 _POSIX_RTSIG_MAX 信号。改用这些定义
  • @JensMunk _POSIX_RTSIG_MAX 在 glibc 的bits/posix1_lim.h 中解析为 8 (!!),而我系统上的实际值是 64。可能是一些信号队列大小或类似的东西。 SIGRTMAX#include <signal.h> 之后也未定义,与我在 NSIG 中遇到的问题类似。
  • 这是 POSIX 兼容所需的最小信号数。当前信号数由 SIGRTMAX 给出。你可能需要给你的编译器一个选项来暴露 SIGRTMIN,检查头文件

标签: posix glibc


【解决方案1】:

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

【讨论】:

  • 不,_NSIG、SIGRTMIN 和 SIGRTMAX 在#include &lt;signal.h&gt; 之后都是不可见的。它们在标头中定义,但也隐藏在复杂的预处理器命令结构后面。要么我没有包含我可以通过 google 找到的文档中没有描述的内容,要么 glibc 不符合 posix-conformant。
  • 在我的系统上它们是完全可见的。试着编译上面的代码,看看它打印出 64。也许你在其他一些头文件中定义了_SIGNAL_H,阻止了定义被读取。只是猜测
  • 你说得对,谢谢!这是我的 c++11 代码中的一个语法问题。 :-) (你会在午夜后起床 :-) )。 NSIG、_NSIG 和 SIGRTMAX 都是可见的,并且工作正常。
【解决方案2】:

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

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

joerg: 为了使可移植的 shell 实现更容易,如果标准还添加一个“NSIG”定义,可以重定向到 getconf() 调用,那将是一个好主意。

kre: NSIG 没有用,除非我们还对用于信号编号的值做出假设,例如它们来自 1..NSIG,标准避免这样做(并且应该继续这样做) .)

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2021-12-10
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多