2012-01-24 69 views
2

使用信號處理程序的正確方法是什麼?使用信號處理程序的正確方法

我看到下面的代碼從這個question,並想知道爲什麼你仍然需要把signal(SIGSEGV,sig_func);裏面的sig_func?當進程收到一個SIGSEGV信號時,不會創建一個無止境的循環嗎?

void sig_func(int sig) 
{ 
    write(1, "Caught signal 11\n", 17); 
    signal(SIGSEGV,sig_func); 
} 

int main() 
{ 


signal(SIGSEGV,sig_func); //Install the signal handler 

//Do work here 
} 

回答

3

signal manual說:

最後,如果處理程序設置爲一個函數sighandler然後第一或者該處理程序被重置爲SIG_DFL或執行信號的實現相關的阻塞和下一個sighandler被稱爲參數符號。

的重複調用signal用於重新安裝自定義的處理後(可能)已經被重置爲SIG_DFL

+0

也可能值得注意的是,手冊頁中提到'signal()的唯一便攜使用是將信號的處置設置爲SIG_DFL或SIG_IGN。使用signal()建立信號處理程序時的語義因系統而異(...); ____不爲此用途____。 POSIX.1通過指定sigaction(2)解決了可移植性問題,它提供了明確的控制...' –

1

在您提供的示例中,調用sig_funct中的信號是無用的,因爲您已經在main中設置了信號處理程序,並且沒有在處理程序中更改它。

考慮到你的第二個問題,不,它不會創建一個無止境的循環,因爲signal()將處理信號SIGSEGV設置爲處理程序,但不執行它。