The GNU C Library Reference Manual有一整章解釋有關的信號處理一切。
當您安裝您自己的處理程序時,您總是會獲得先前設置的信號處理程序(函數指針)(請參閱signal()
或sigaction()
的聯機幫助頁)。
previous_handler = signal(SIGINT, myhandler);
一般的規則是,你可以總是重置到前面的處理程序和raise()
的信號。
void myhandler(int sig) {
/* own stuff .. */
signal(sig, previous_handler);
raise(sig);
/* when it returns here .. set our signal handler again */
signal(sig, myhandler);
}
有一個的一般規則的缺點:被映射到信號的硬件異常通常被分配給一個特定的指令,該指令引起異常。所以,當你再次發出信號時,相關的指令與原來的不一樣。這可以但不應該傷害其他信號處理程序。
另一個缺點是,每個提出的信號造成了大量的處理時間。爲了防止過度使用raise()
您可以使用下列選項:
在SIG_DFL
函數指針點的情況下,解決0
(這顯然是沒有有效的地址)。因此,你必須重新設置處理程序和raise()
的信號。
if (previous_handler == SIG_DFL)
{
signal(sig, SIG_DFL);
raise(sig);
signal(sig, myhandler);
}
SIG_IGN
具有值1
(也無效地址)。在這裏,你可以返回(什麼也不做)。
else if (previous_handler == SIG_IGN)
{
return;
}
否則(既不SIG_IGN
也不SIG_DFL
)你收到了一個有效的函數指針,你可以直接調用處理程序,
else
{
previous_handler(sig);
}
當然,你必須要考慮的不同的API(請參閱signal()
和sigaction()
的聯機幫助頁)。
[顯式調用Linux上的SIG \ _DFL/SIG \ _IGN處理程序]的可能重複(http://stackoverflow.com/questions/3147840/explicitly-invoke-sig-dfl-sig-ign-handlers-on-linux ) – pilcrow 2014-12-21 04:31:35