2011-12-20 46 views
6

我要送兩個信號的過程,SIGUSR1SIGUSR2,以修改特定布爾變量在程序(SIGUSR1它設置爲真正SIGUSR2套它) 。所以我寫了一個signalHandler()函數來控制SIGUSR1SIGUSR2的行爲。問題是:如何設置sigaction()來處理這個特定的任務?我在Google上花了很多時間,我到處都看到我應該使用sigaction()而不是陳舊的signal()。在手冊頁,我發現這個使用的sigaction()的

int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 

在正負號我已經把我想要處理信號的類型,那麼我有一個struct sigaction的參數:

struct sigaction { 
     void  (*sa_handler)(int); 
     void  (*sa_sigaction)(int, siginfo_t *, void *); 
     sigset_t sa_mask; 
     int  sa_flags; 
     void  (*sa_restorer)(void); 
    }; 

在第一場我還以爲我應該設置我的信號處理程序的名稱,但我不知道如何設置其他字段。

最後,有什麼用:struct sigaction *oldact

+0

'oldact'存儲信號編號'signum'的先前信號處理狀態。 – moshbear 2011-12-20 10:18:08

+0

@moshbear如果我不想使用它,我可以將它設置爲NULL嗎? – Sicioldr 2011-12-20 10:19:30

+0

__是的,你可以。 (請原諒下劃線,但評論的長度限制爲15字符)。 – moshbear 2011-12-20 11:07:28

回答

7

請參閱sigaction(2)手冊頁。這裏都有描述。

基本上,您可以設置sa_handlersa_sigaction,具體取決於您是否需要額外的信號信息。

如果您設置的是後者,則需要將SA_SIGINFO添加到標誌。否則,標誌應該可能爲0。你可能希望系統調用在錯誤信號(缺省行爲)時被errno EINTR中斷,所以你可以在重新啓動它們之前考慮變量的新值,但是如果你想要自動重新啓動它們(selectpoll永遠不會重新啓動),您可以設置SA_RESTART標誌。

sa_mask是一組信號,應該在這個信號處理程序正在運行時被觸發。你至少應該設置兩個信號,所以如果它們快速連續出現,就不會混淆。

而最後一個,sa_restorer已經過時並且無用。

相關問題