2012-08-13 57 views
2

當多線程應用程序中的Linux發生分段錯誤並且處理程序被調用時,是否所有其他線程在調用處理程序之前立即停止? 那麼,在分段錯誤處理過程中是否可以執行任何parralel代碼,這是否合適呢? 謝謝。分段錯誤處理程序是線程安全的嗎?

+0

你可以在一個簡單的程序中測試嗎?啓動兩個線程,一個使用自己的SIGSEGV處理程序。 SIGSEGV線程並將其從處理程序內部放入睡眠狀態。第一個線程運行在一個無限循環打印的東西。然後你自己回答你的問題。我不知道這是我自己,我有興趣學習 – 2012-08-14 06:42:15

+0

這很簡單,但我試圖避免這樣的決定,如果我將運行和測試行爲,它將被證明僅用於特定的harware /軟件版本(gcc, libc,linux發行版,debug/release等等)。但有針對性的軟件運行在多個平臺上。 – Slav 2012-08-14 07:30:56

回答

0

signal(7)手冊頁面:

可以產生的信號(以及因此待處理),用於處理作爲一個整體(例如,當使用發出殺(2))或用於一個特定的線程(例如,由於執行特定的機器語言指令而產生的某些信號,例如SIGSEGV和SIGFPE,都是線程控制的,就像使用pthread_kill(3)針對特定線程的信號一樣)。處理導向的信號可以被傳遞到當前沒有信號阻塞的任何一個線程。如果不止一個線程的信號未被阻塞,那麼內核會選擇一個任意線程來傳遞信號。

本段說某些信號,如SIGSEGV,是線程特定的。哪個應該回答你的問題。

+0

我看不到這段話的直接答案:它表示SIGSEGV將針對特定的線程,但沒有提到其他線程的命運。 – Slav 2012-08-14 06:25:24

+0

@Slav老實說,如果你遇到分段錯誤,不管怎樣你都不可能繼續下去。遲些,錯誤將會級聯,並且整個過程將會消失。捕獲'SIGSEGV'只有在中止進程之前提供額外的日誌記錄纔有用,除非錯誤記錄在日誌代碼中,在這種情況下它仍然會死亡。 – 2012-08-14 06:50:33

+0

我也這麼認爲,並且在seg-fault-handler中實現了一些「安全先發制人」任務。在這裏和那裏,我面臨着我使用的多個庫中的一些錯誤,並且希望不會錯過服務器中的任何兌現數據,但是如果服務器將保存修改數據的權利,那麼它將不會有用,當我將它保存在seg-fault-handler 。 – Slav 2012-08-14 07:34:23