天天看點

unix環境進階程式設計(閱讀筆記)------signal函數與sigaction的差別

signal函數每次設定具體的信号處理函數(非SIG_IGN)隻能生效一次,每次在程序響應處理信号時,随即将信号處理函數恢複為預設處理方式.是以如果想多次相同方式處理某個信号,通常的做法是,在響應函數開始,再次調用signal設定,如下圖:

int sig_int(); //My signal handler

  ...

 signal(SIGINT, sig_int);

    ...

int sig_int()

{

    signal(SIGINT, sig_int);

    ....

}

這種代碼段的一個問題是:在信号發生之後到信号處理程式中調用s i g n a l函數之間有一個

時間視窗。在此段時間中,可能發生另一次中斷信号。第二個信号會造成執行預設動作,而對

中斷信号則是終止該程序。這種類型的程式段在大多數情況下會正常工作,使得我們認為它們

正确,而實際上卻并不是如此。

另一個問題是:在程序不希望某種信号發生時,它不能關閉該信号。

sigaction: 

1.在信号處理程式被調用時,系統建立的新信号屏蔽字會自動包括正被遞送的信号。是以保證了在處理一個給定的信号時,如果這種信号再次發生,那麼它會被阻塞到對前一個信号的處理結束為止

2.響應函數設定後就一直有效,不會重置

3.對除S I G A L R M以外的所有信号都企圖設定S A _ R E S TA RT标志,于是被這些信号中斷的系統調用(read,write)都能自動再起動。不希望再起動由S I G A L R M信号中斷的系統調用的原因是希望對I / O操作可以設定時間限制。

是以希望能用相同方式處理信号的多次出現,最好用sigaction.信号隻出現并處理一次,可以用signal。

signal具體執行幾次,會根據平台的不同而發生改變。

繼續閱讀