即使程序刚刚启动,是否也可以始终捕获信号?

Is it possible to always catch signal even if program just started yet?

我想捕获发送到我的程序的信号并执行简单的操作(例如,使用指定代码退出)。但是,如果进程在我的信号处理程序设置之前接收到信号,它就会异常退出,就像不存在处理程序一样。

我的简单程序的源代码:

#include <signal.h>
#include <stdlib.h>
#include <unistd.h>

void handler(int sig) { exit(0); }

int main()
{
    signal(SIGTERM, handler);
    while(1) { sleep(1); }
    return 0;
}

使用 g++ my.c 命令编译。

脚本到 运行 连续编程:

while true; do ./a.out; echo $?; done

如果我手动发送信号进行处理,那么大多数时候一切正常 - 以零代码退出。但是如果我使用下面的脚本:

频繁发送信号给进程的脚本:

while true; do slay -sSIGTERM a.out; done

我收到了很多 Terminated 143 条消息。

但是,如果我使用 gcc(而不是 g++),我将无法获得非零退出代码的情况。

在这方面,问题是如何获得与 C(gcc 编译)程序行为相似的 C++(g++ 编译)程序?

最好采用最大标准化方法。

在 QNX 6.5、gcc 4.7.2 上测试

实现您想要的唯一方法是让父进程在分叉之前阻止所有信号 (sigprocmask) 并等待在设置信号处理程序之后解除阻止。纯粹在你自己的程序中的任何东西都是无用的,因为信号仍然可以到达 window 父分支和它执行的地方之间。