多執行緒下的訊號處理

2021-07-04 22:03:11 字數 1300 閱讀 4952

參考apue

1.同乙個程序下的所有執行緒共享 訊號的處理方式,所以乙個執行緒改變對訊號的處理方式,那所有執行緒如果收到該訊號都會是那樣處理的

2.sigprocmask用於單執行緒的程序中阻止訊號傳送,但是在多執行緒的程序中並沒有定義

執行緒必須使用pthread_sigmask.

a.如果有的執行緒可以遮蔽了某個訊號,而某些執行緒可以處理這個訊號,

系統會將這個訊號投遞到程序號最小的那個可以處理這個訊號的執行緒中去處理?(摘自網路,不確定是最小的還是可以處理的執行緒中隨機的乙個)

b.如果訊號的產生與某個執行緒有關(如硬體故障,計數器超時),則

該訊號傳送到引起該事件的執行緒去,其他訊號則被傳送到任意乙個執行緒(摘自apue)

3.呼叫sigwait之前必須阻塞它要等到的訊號,不過不阻塞,可能還沒有呼叫sigwait訊號就到了,多個執行緒sigwait同一訊號,只有乙個可以從sigwait返回。如果訊號同時通過sigaction之類的設定了訊號處理程式,那由作業系統決定到底是從sigwait返回還是啟用訊號處理程式。

訊號安裝最好採用sigaction方式,

sigaction,是為替代signal 來設計的較穩定的訊號處理

,signal的使用比較簡單。signal(signalno,signalproc);

signal不能完成的任務是:1.不知道訊號產生的原因;

2.處理訊號中不能阻塞其他的訊號

而signaction,則可以設定比較多的訊息。尤其是在訊號處理函式過程中接受訊號,進行何種處理。

1.在訊號處理程式被呼叫時,

系統建立的新訊號遮蔽字會自動包括正被遞送的訊號

。因此保證了在處理乙個

給定的訊號時,如果這種訊號再次發生,那麼它會被阻塞到對前乙個訊號的處理結束為止

2.響應函式設定後就一直有效,不會重置

3.對除sigalrm以外的所有訊號都企圖設定sa_restart標誌,

於是被這些訊號中斷

的系統呼叫(read,write)都能自動再起動

。不希望再起動由sigalrm訊號中斷的系統呼叫的原因是希望對i/o操作可以設定時間限制。

所以希望能

用相同方式處理訊號的多次出現,最好用sigaction.訊號只出現並處理一次,可以用signal

python多執行緒下訊號處理程式示例

下面是乙個網上 的實現思路,經過oyyaovp驗證,發現是可行的,就記錄下來。思路python多執行緒中要響應ctrl c的訊號以殺死整個程序,需要 1.把所有子執行緒設為daemon 2.使用isalive 函式判斷所有子執行緒是否完成,而不是在主線程中用join 函式等待完成 3.寫乙個響應ct...

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

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

LINUX下多執行緒和訊號

說實話,訊號是我討厭的東西,在我些的 中,我都想用最簡單的辦法來處理它,現在遇到多執行緒中訊號的處理,apue中的說法也看得不是很懂,csdn中一位朋友有如下的總結,先記在這裡。1.預設情況下,訊號將由主程序接收處理,就算訊號處理函式是由子執行緒註冊的 2.每個執行緒均有自己的訊號遮蔽字,可以使用s...