如果多執行緒 Linux 程序收到信號,會發生什麼情況?
如果 Unix (Posix) 程序接收到信號,則會執行信號處理程序。
在多執行緒程序中會發生什麼?哪個執行緒接收信號?
在我看來,信號 API 應該被擴展來處理它(即信號處理程序的執行緒應該能夠被確定),但是在網上尋找資訊我只在 linux 核心郵件列表和 on 上發現了長達一年的火焰不同的論壇。據我了解,Linus 的概念不同於 Posix 標準,首先建構了一些兼容層,但現在 Linux 遵循 posix 模型。
目前的狀態是什麼?
“基本原理:系統介面一般資訊”中關於“信號生成和傳遞”的 POSIX 條目說
為程序生成的信號僅傳遞給一個執行緒。因此,如果多個執行緒有資格接收信號,則必須選擇一個。執行緒的選擇完全由實現決定,以允許盡可能廣泛的符合實現的範圍,並讓實現可以自由地將信號傳遞給“最簡單的”執行緒,如果不同執行緒之間的傳遞難易程度存在差異。
來自
signal(7)
Linux 系統上的手冊:可以為整個程序(例如,當使用 發送時
kill(2)
)或為特定執行緒(例如,某些信號,例如 SIGSEGV 和 SIGFPE,作為執行特定機器的結果而生成 -語言指令是執行緒導向的,使用 ) 針對特定執行緒的信號也是如此pthread_kill(3)
。程序導向的信號可以被傳遞到目前沒有阻塞信號的任何一個執行緒。如果多個執行緒的信號被解除阻塞,那麼核心選擇一個任意執行緒來傳遞信號。並在
pthreads(7)
:執行緒具有不同的備用信號堆棧設置。但是,新執行緒的備用信號堆棧設置是從創建它的執行緒複製的,因此執行緒最初共享一個備用信號堆棧(在核心 2.6.16 中修復)。
來自
pthreads(3)
OpenBSD 系統的手冊(作為替代方法的範例):信號處理程序通常在目前執行執行緒的堆棧上執行。
(我目前不知道當多個執行緒在多處理器機器上同時執行時如何處理)
POSIX 執行緒的舊 LinuxThread 實現只允許信號針對不同的單個執行緒。在
pthreads(7)
Linux 系統上:LinuxThreads 不支持程序導向信號的概念:信號只能發送到特定執行緒。