我一直在試圖了解如何POSIX線程和POSIX信號相互作用的復雜性。我特別感興趣:控制信號傳遞到哪個線程的最佳方法是什么(假設它首先不會致命)?告訴另一個線程(實際上可能很忙)信號到達的最佳方法是什么?(我已經知道,使用信號處理程序中的pthread條件變量是一個壞主意。)如何安全處理將發生信號的信息傳遞給其他線程?這是否需要在信號處理程序中發生?(我通常不希望殺死其他線程;我需要一種更巧妙的方法。)作為我為什么要這樣做的參考,我正在研究如何將TclX包轉換為支持線程,或者將其拆分并至少使一些有用的部件支持線程。信號是那些特別令人感興趣的部分之一。
3 回答

呼如林
TA貢獻1798條經驗 獲得超3個贊
根據POSIX標準,所有線程在系統上應以相同的PID出現,并且使用pthread_sigmask()可以為每個線程定義信號阻止掩碼。
由于只允許為每個PID定義一個信號處理程序,因此我更喜歡在一個線程中處理所有信號,并pthread_cancel()在需要取消正在運行的線程時發送。這是首選方法,pthread_kill()因為它允許為線程定義清理功能。
在某些較舊的系統上,由于缺少適當的內核支持,正在運行的線程可能具有與父線程的PID不同的PID。有關在Linux 2.4上使用linuxThreads處理信號的信息,請參見常見問題解答。

侃侃爾雅
TA貢獻1801條經驗 獲得超16個贊
到目前為止,我在哪里:
信號來自不同的主要類別,其中一些通常通常應該終止進程(SIGILL),而某些則永遠不需要做任何事情(SIGIO;更容易直接進行異步IO)。這兩個類無需采取任何措施。
有些信號不需要立即處理。像SIGWINCH這樣的東西可以排隊直到方便為止(就像X11中的事件一樣)。
棘手的是那些您想通過中斷正在執行的操作來對它們做出響應,而又不會消滅線程的程度。特別是,在交互模式下的SIGINT應該使事物響應。
我還有需要整理signal
VS sigaction
,pselect
,sigwait
,sigaltstack
,和一大堆其他位和POSIX(和非POSIX)API的作品。
- 3 回答
- 0 關注
- 473 瀏覽
添加回答
舉報
0/150
提交
取消