LINUX下多執行緒和訊號

2021-05-21 21:30:07 字數 744 閱讀 5792

說實話,訊號是我討厭的東西,在我些的**中,我都想用最簡單的辦法來處理它,現在遇到多執行緒中訊號的處理,apue中的說法也看得不是很懂,csdn中一位朋友有如下的總結,先記在這裡。

1. 預設情況下,訊號將由主程序接收處理,就算訊號處理函式是由子執行緒註冊的

2. 每個執行緒均有自己的訊號遮蔽字,可以使用sigprocmask函式來遮蔽某個執行緒對該訊號的響應處理,僅留下需要處理該訊號的執行緒來處理指定的訊號。

3. 對某個訊號處理函式,以程式執行時最後一次註冊的處理函式為準,即在所有的執行緒裡,同乙個訊號在任何執行緒裡對該訊號的處理一定相同

4. 可以使用pthread_kill對指定的執行緒傳送訊號

apue的說法:每個執行緒都有自己的訊號遮蔽字,但是訊號的處理是程序中所有的執行緒共享的,

這意味著儘管單個執行緒可以阻止某些訊號,但當執行緒修改了與某個訊號相關的處理行為後,所

有的執行緒都共享這個處理行為的改變。這樣如果乙個執行緒選擇忽略某個訊號,而其他執行緒可

以恢復訊號的預設處理行為,或者為訊號設定乙個新的處理程式,從而可以撤銷上述執行緒的

訊號選擇。

程序中的訊號是送到單個執行緒的,如果訊號與硬體故障或者計時器超時有關,該型號就被發

送到引起該事件的執行緒中去,而其他的訊號則被傳送到任意乙個執行緒。

sigprocmask的行為在多執行緒的程序中沒有定義,執行緒必須使用pthread_sigmask

總結:乙個訊號可以被沒遮蔽它的任何乙個執行緒處理,但是在乙個程序內只有乙個多個執行緒共用的處理函式。

多執行緒下的訊號處理

參考apue 1.同乙個程序下的所有執行緒共享 訊號的處理方式,所以乙個執行緒改變對訊號的處理方式,那所有執行緒如果收到該訊號都會是那樣處理的 2.sigprocmask用於單執行緒的程序中阻止訊號傳送,但是在多執行緒的程序中並沒有定義 執行緒必須使用pthread sigmask.a.如果有的執行...

Linux 多執行緒應用 訊號產生,訊號處理

筆者有一種應用場景,a 執行緒從 socket 接收指令,根據指令在 b 執行緒進行相應工作。採用訊號機制,設定 sigusr1 的訊號處理函式 sighandler,a 執行緒解析指令後發射訊號 sigusr1,b 執行緒執行sighandler.因對 posix 訊號機制不熟,過程中產生了一些誤...

Linux 執行緒和訊號

每個執行緒都有自己的訊號遮蔽字,但是訊號的處理是程序中所有執行緒共享的。這意味著單個執行緒可以阻止某個訊號,但是當某個執行緒修改了乙個訊號的處理行為,那麼所有執行緒都會共享這個改變。程序中的訊號是遞送到單個執行緒的。如果乙個訊號和硬體故障相關,那麼該訊號一般會被傳送到引起該事件的執行緒中去,而其他的...