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

时间:2015-04-21 15:10:42

标签: c++ c gcc qnx signal-handling

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

我简单程序的源代码:

#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

1 个答案:

答案 0 :(得分:1)

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