2011-06-30 83 views
14

我在Linux中有一個多線程的程序。我有興趣瞭解某些內存區域是否在特定時間段內寫入的。爲此,我只對這些內存頁面進行讀訪問,併爲SIGSEGV安裝信號處理程序。現在我的問題是,每個線程都會爲自己調用信號處理程序。說線程1寫入一些禁止的內存區域,是否會執行信號處理程序?是SIGSEGV傳遞給每個線程?

回答

19

所有

信號處置首先是進程範圍; 進程中的所有線程共享每個信號的相同配置。如果 一個線程使用sigaction()到 爲SIGINT, 建立處理程序,那麼可以從 調用該處理程序,以便傳送SIGINT爲 的任何線程。

但在

的信號讀取,可向任一 過程作爲一個整體或特定 螺紋。的信號,如果

其被作爲直接結果的特定 硬件指令的線程的 上下文中的執行的 產生螺紋定向(SIGBUS, SIGFPE, SIGILL, and SIGSEGV

我從引用TLPI

+0

這意味着SIGSEGV信號處理程序將由寫入禁止內存的線程執行,對吧? – MetallicPriest

+0

@MetallicPriest是的,但它是所有線程相同的處理程序。 – cnicutar

+0

它也取決於哪個線程稱爲mprotect?我認爲mprotect是針對整個過程的,對吧? – MetallicPriest

5

不,根據問題標題。

對於問題主體:對於您要求的特定信號,是(否則:取決於)。導致段錯誤的線程將收到信號。

signal(7)

A signal may be generated (and thus pending) for a process as a whole (e.g., 
when sent using kill(2)) or for a specific thread (e.g., certain signals, such 
as SIGSEGV and SIGFPE, generated as a consequence of executing a specific 
machine-language instruction are thread directed [...]. 
+0

爲什麼你說不,在描述中寫道SIGSEGV是線程定向的? – MetallicPriest

+3

因爲問題是關於「to_each_ thread」。 'SIGSEGV'被傳遞給_one_線程(引起它的那個線程)。因此,沒有。 (但是,當然,如果沒有處理它,它可能(通常會)會殺死整個過程,這顯然會影響其他每個線程 - 但是信號不會傳遞給每個線程。) – Damon

+0

標題中的問題沒有完全符合體內的問題;他們要求提供相同的底層信息,但對其中一個「否」對另一個是「是」。所以你可能想調整你的答案,以明確你說哪一個「不」。 – ruakh