深入理解linux內核——信號

信號是很短的消息,可以被髮送到一個進程或一組進程。發送給進程的唯一信號通常是一個數。

使用信號的兩個主要的目的是:

讓進程知道已經發生了一個特定的事件。

強迫進程執行它自己代碼中的信號處理程序。

信號的一個重要特點是它們可以隨時被髮送給狀態經常不可預知的進程。發送給非運行進程的信息號必須由內核保護,直到進程恢復執行。阻塞一個信號要求信號的傳遞拖延,直到隨後解除阻塞,這使得信號產生一段時間之後才能對其傳遞這一問題變得更加嚴重。

因此,內核區分信息傳遞的兩個不同階段:

信號產生

內核更新目標進程的數據結表示一個新信號已被髮送。

信號傳遞

內核強迫目標進程通過以下方式對信號作出反應:或改變目標進程的執行狀態,或開始執行一個特定的信號處理程序,或兩者都是。

深入理解linux內核——信號

每個所產生的信號至多被傳遞一次。信號是可以消費資源:一旦它們已傳遞出去,進程描述符中有關這個信號的所有信息都被取消。

已經產生但還沒有傳遞的信號稱為掛起信號(pending singal)。任何時候,一個進程僅存在給定類型的一個掛起信號,同一進程同種類型的其他信息不被排隊,只被簡單地丟棄。但是,實時信號是不同的:同種類型的掛起信號可以有好幾個。

深入理解linux內核——信號

進程描述符的signal字段指向信號描述符(signal descriptor)-- 一個single_struct類型的結構,用來跟蹤共享掛起信號。

除了信號描述符以外, 每個進程還引用一個信號處理程序描述符(signad handler descriplor),它是一個sighand_strust類型的結構,用來描述每個信號必須怎樣被線程組處理。

深入理解linux內核——信號

很多內核函數都會產生信號:它們完成信號處理第一步的工作,即根據需要更新一個或多個進程的描述符。它們不直接執行第二步的信號民傳遞操作,而是可能根據信號的類型和目標進程的狀態喚醒一些進程,並促使這些進程接收信號。


分享到:


相關文章: