2015-04-21 133 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

由於執行的代碼量不同,只是不同的時間,我會假設。你想要的行爲是**不可能**沒有父母的幫助,但這並不意味着失敗很容易觀察。這是短距離賽車的本質。 –

相關問題