linux核心如何處理信號
我的問題是關於信號並在作業系統核心中處理它們。
我知道每個程序都有自己的
signal_handler()
表:一個 31 位的信號數組(pending_signals
),當信號到達時,do_signal() 被呼叫,它呼叫相關的signal_handler()
常式,該常式在使用者模式下執行,而不是在核心模式(為什麼會這樣?)。讓我們假設程序得到了一些信號,即他的信號數組中的某個位是打開的,誰正在將它寫入這個數組(我猜是呼叫信號的程序——我們目前在它的上下文中的程序),因此,流程如下:
A
呼叫信號並將其寫入B
’s 的信號數組(在返回使用者模式之前?)然後在相同的上下文中(不切換到 B)B
呼叫 ’s 的這個信號的特定信號處理程序(我們什麼時候切換到使用者模式? ) 然後我們返回A
並檢查它是否需要重新安排並繼續……第二件事是當信號是時發生了什麼
SIG_CHILD
,我想它應該發生在do_exit()
子程序呼叫的某個地方。最後一件事是如何
waitpid(pid_t num)
工作?父親如何無視
SIG_CHILD
其他兒子的所有信號,只關心特定的兒子?如果有很好的來源可以閱讀以下內容,那就太好了(沒有找到)。
在閱讀您的問題時。我想你說的信號句柄
B
是在A
. 這聽起來不正確。這將導致安全漏洞。信號處理程序總是在擁有程序的上下文中呼叫。然後,這將回答您關於
SIG_CHILD
.您還問為什麼在使用者空間中執行信號句柄。這是因為我們不想讓程序將程式碼注入核心。如果他們這樣做了,他們將成為系統的上帝。
信號處理程序在什麼程序中執行?
如果一個程序呼叫 exec,並且載入的程式碼包含一個 signal_handler,並且如果這個信號處理程序執行,那麼(就像所有其他載入的程式碼一樣)它在這個程序中執行。您不會意外地從一個程序中找到在另一個程序中執行的程式碼。