我有一個多線程應用程序,運行30多線程。我知道有一個錯誤,有時兩個線程試圖同時排序一個列表,這通常會導致其中一個線程訪問無效內存。因此,爲該線程生成了一個SIGSEGV
。SIGSEGV不終止進程
現在,根據我對信號的瞭解,線程應調用SIG_DFL
爲SIGSEGV
,這是異常終止進程和coredump。然而,我看到這個過程仍然活着(處於一種不靈活的狀態),執行停止,但過程仍然存在。當我試圖kill
它時,SIGTERM
實際上傳播到我的自定義信號處理程序(它試圖很好地關閉所有線程),但它掛起,因爲沒有任何線程實際上執行了。我終於設法使用SIGQUIT
殺死它,並在那之後生成了核心文件。
所以我的問題是「異常終止」是什麼意思?如果SIG_DFL
被稱爲SIGSEGV
,如何不能從內存中刪除進程?可能會發生什麼導致這種行爲?我的Linux是紅帽企業Linux服務器版本5.11(Tikanga)
編輯:我知道(或多或少)如何調試它,我甚至知道錯誤是什麼。我的問題是或多或少:在SIGSEGV調用SIG_DFL時,RedHat究竟做了什麼?問題在於這個過程沒有響應,但也沒有死亡 - 因此自動重啓程序沒有啓動,我們有一些不愉快的停機時間。
你說你有一個自定義信號手柄,它有什麼作用? – Adam
SIGTERM的預期行爲是終止進程,但可以捕獲SIGTERM並執行其他操作。 SIGKILL是不可撤銷的強制退出。即'kill -9 12345' – Adam
另外,有沒有'ps'列出你的程序爲?如果是這樣,這是一個殭屍進程(即它退出,但它的返回值尚未被啓動過程讀取)。 –
Adam