我想創建一個單元測驗框架,但是為了提供一個好的報告,我需要捕捉 SIGABRT、SIGSEGV 和其他可能的信號以防止我的行程被殺死(因此,為了能夠繼續測驗處理)......
但我不知道該怎么做,所以,我需要資訊:
- SIGABRT 是執行緒直接信號?
- 如果我只使用主執行緒來捕捉 SIGABRT(或 SIGSEGV)信號會發生什么?呼叫 abort 的執行緒能否從它的呼叫中回傳(我希望不會)?
如果您有任何有用的檔案、鏈接或教程,我很感興趣。它用于使用 pthreads 的 C 代碼。
謝謝你的幫助
uj5u.com熱心網友回復:
我需要捕捉 SIGABRT、SIGSEGV 和其他可能的信號以防止我的行程被殺死
這是徒勞的練習。在引發SIGABRT或SIGSEGV引發之后,您(通常)不知道行程的狀態——它可能損壞了堆、堆疊、測驗框架內部的全域資料、C 運行時系統內部的全域資料等。繼續這樣的程序極有可能繼續在代碼中的隨機(正確)位置崩潰。
該只在一個測驗框架來處理這個理智的辦法是fork和有父行程句柄孩子錯誤退出,報告這些并繼續運行額外的測驗。
SIGABRT 是執行緒直接信號?
沒有“直接信號”這樣的東西。SIGABRT可以從外部發送到行程,也可以發送到行程raise內部。
如果我只使用主執行緒來捕捉 SIGABRT(或 SIGSEGV)信號會發生什么?
SIGSEGVand SIGABRT(當不是從外部發送時)被發送到導致無效記憶體操作(或raised it)的執行緒。
此外,沒有辦法“只使用主執行緒”——sigaction在所有執行緒中都是全域的(盡管您可以設定執行緒特定的信號掩碼)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/379648.html
上一篇:執行緒鎖允許同時執行緒訪問
