Linux

如果多執行緒 Linux 程序收到信號,會發生什麼情況?

  • April 29, 2021

如果 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 不支持程序導向信號的概念:信號只能發送到特定執行緒。

引用自:https://unix.stackexchange.com/questions/225687