2011-02-25 34 views
0

我正在一個項目上工作,找不到任何文檔驗證信號/線程行爲爲以下情況。需要保證信號將被冒犯線程

我需要確保線程中生成的信號將由違規線程傳遞(即SIGSEGV)。我一直在告訴 POSIX不確保這種行爲,例如pthreads可以生成pthread 1中的信號,但仍然有信號在pthread 2中傳送。因此,我計劃使用clone(2)更好地控制信號/線程行爲,但仍然無法在手冊頁中找到確保信號將由違規線程傳遞的文檔。

核心系統程序員:任何文檔或見解將非常感激!

回答

3

POSIX chapter on Signal Generation and Delivery指出:

在產生時,一個 判定應作出是否 信號已經爲 過程或過程中的一特定線程 被生成。 生成的 對某個特定線程(如 硬件故障)生成的信號爲 ,應生成 線程,該線程導致信號生成爲 。應爲 進程生成與 進程ID或進程組ID或 異步事件(如終端 活動)關聯生成的 信號。

引起在一個線程的不正確的存儲器存取的同步SIGSEGV顯然是這樣的信號「...通過某些動作歸因於一個特定的線程生成的...」,所以它們保證將要產生對於有問題的線程(這意味着由該線程處理或忽略)。

0

我很確定這是有效的,即使它不能保證。我基於這樣的觀察,即我曾經在一家公司工作,我們在多線程程序中常規處理SIGSEGV,並將堆棧跟蹤打印到日誌文件(基於當前位置)。我們在各種平臺上做到了這一點 - windows,linux,tru64 unix,aix,hpux,sunos ...以及其他一兩個我無法想起的平臺。由於SIGSEGV的位置仍然在當前堆棧上(信號處理機制只是在其頂部添加了一些調用幀),所以這通常是可行的。

在信號處理程序中很少有你應該做的事情,因爲沒有太多的函數是異步信號安全的。我們忽略了這一點,並且大部分情況都沒有了,除非我回想起sunos(或aix)我們會被燒掉 - 這個過程偶爾會(並且看起來隨機)在信號處理程序中退出。

我相信推薦的方法是不處理SIGSEGV,並讓該進程退出並進行核心轉儲,以便稍後在調試器中進行分析。