我想捕获发送到我的程序的信号并执行简单的操作(例如,使用指定的代码退出)。但是如果进程在我的信号处理程序设置之前收到一个信号,它就会像没有处理程序一样异常退出。
我简单程序的源代码:
#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
答案 0 :(得分:1)
实现目标的唯一方法是让父进程在分叉之前阻止所有信号(sigprocmask
),并等待解除阻塞直到设置信号处理程序之后。纯粹在你自己的程序中的任何东西都是无用的,因为信号仍然可以到达父叉的窗口和它所执行的位置之间。