2015-04-21 135 views
0

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

的源代码:

#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(gcc编译)程序相似的行为?

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

在测试了QNX 6.5,GCC 4.7.2

回答

1

达到你想要的东西的唯一方法是分叉之前有父进程块中的所有信号(sigprocmask),并等待它们解除封锁,直到设置你的信号后,处理程序。任何纯粹在你自己的程序中的东西都是无用的,因为信号仍然可能在父母分叉的窗口和高管的窗口之间到达。

+0

但是,为什么使用c而不是C++时会出现如此不同的行为?在C++的情况下一些更复杂的初始化?是否有可能简化它? – alexolut

+0

由于执行的代码量不同,只是不同的时间,我会假设。你想要的行为是**不可能**没有父母的帮助,但这并不意味着失败很容易观察。这是短距离赛车的本质。 –

相关问题