2012-08-13 101 views
4

在Linux下的分段錯誤處理程序中發生了分段錯誤是否存在一些定義的行爲? 是否會有另一個調用相同的處理程序?如果是這樣,在所有平臺上,它是如何定義的等等。 謝謝。分段錯誤處理程序中的分段錯誤

+0

再次調用相同的處理程序可能會導致無限遞歸,我懷疑這是任何平臺上定義的行爲。 – scai 2012-08-13 14:14:57

+0

那麼,在那個鏈接被告知有關修復引起分割問題的問題,而不是關於分段錯誤處理程序本身內的分段錯誤。 – Slav 2012-08-13 14:16:22

+0

可能是無限遞歸。我不認爲無論如何寫一個段錯誤處理程序是一個好主意。如果你的應用程序出現故障,你可能想要終止。我使用segfault hander除了關鍵的應用程序清理或調試以外,您可能不應該使用它。 – Linuxios 2012-08-13 14:16:38

回答

1

C-11標準,7.14.1.1

當發生信號和FUNC指向一個函數,它是 實現定義是否信號的等價(sig,SIG_DFL); 被執行或實現阻止一些實現定義的信號組(至少包括sig)發生,直到當前信號處理已完成;

所以標準說它是實現定義它是否允許遞歸調用同一個信號處理程序。 所以我會得出結論,行爲是定義的,但實現定義爲

但它的一塌糊塗,如果段錯誤處理程序本身:)段錯誤

+0

但是,所有這一切意味着POSIX都有答案,而不是C標準。 – Linuxios 2012-08-13 14:36:54

2

比答案取決於你如何安裝信號處理程序。如果您使用不推薦使用的signal()調用來安裝信號處理程序,那麼它會在調用信號處理程序之前將信號處理程序重置爲默認處理程序或阻止處理的信號。如果它阻止了信號,它會在你的信號處理程序返回後解除它的阻塞。

如果您使用sigaction(),則可以控制在調用信號處理程序時哪些信號被阻塞。如果這樣指定,則可能導致無限遞歸。

有可能實現圍繞sigaction()有類似signal()的API安全包裝:

sighandler_t safe_signal (int sig, sighandler_t h) { 
    struct sigaction sa; 
    struct sigaction osa; 
    sa.sa_handler = h; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 
    if (sigaction(sig, &sa, &osa) < 0) { 
     return SIG_ERR; 
    } 
    return osa.sa_handler; 
} 

此塊的信號處理程序調用的持續時間,這將會信號處理程序返回之後恢復所有信號。