2016-03-04 81 views
0

我有一個測試程序,用於處理信號的C庫的一部分。在這個測試程序中有很多代碼 - 非常多,我覺得在這裏發佈它只會讓我更難回答我的問題。SIGSEGV發送兩次 - 處理後崩潰程序

基本上發生的事情是,我迫使系統在後臺線程中向我發送一個SIGSEGV。我處理這個信號,然後測試結束。主線程將等待這個信號處理程序的一部分是重新啓動主線程。當主線程重新啓動我恢復默認信號處理程序signal(SIGSEGV, SIG_DFL)然後我得到另一個 SIGSEGV

我知道我有很多代碼,這很可能是我的錯,但是爲什麼SIGSEGV會觸發兩次?當我引起其他信號時,它不會發生(儘管我沒有嘗試過所有這些信號)。

爲了說明我在OS X上編寫C語言,使用gcc編譯。

回答

0

如果您在信號處理程序中有任何問題,例如內存覆蓋,嘗試訪問超出分配區域,則會引發新的信號。詳細信息請查看以下頁面。

http://www.gnu.org/software/libc/manual/html_node/Signals-in-Handler.html

您還應該使用重入函數的內部信號處理,例如則localtime_r,而不是本地時間。

此外,建議使用sigaction()而不是signal()。

更多細節在這裏:What is the difference between sigaction and signal?