深入理解計算機系統-第八章 異常流控制

深入理解計算機系統閱讀記錄

8.5信號

傳送一個信號到目的進程由兩個不同的步驟組成

發送信號:內核通過更新目的進程上下文中的某個狀態,發送一個信號給目的進程。發送信號可以有兩種原因:

1)內核檢測到一個系統事件,比如除零錯誤或者子進程的終止

2)一個進程調用了kill函數,顯示的要求內核發送一個信號給目的進程。一個進程可以發送信號給自己

接收信號:當目的進程被內核強迫以某種方式對信號的發送做出反應時,它就接收了信號。進程可以忽略這個信號,終止或者通過執行一個稱爲信號處理程序的用戶層函數捕獲這個信號。

 

一個發出而沒有被接收的信號叫做待處理信號。在任何時刻,一種類型至多隻會有一個待處理信號。如果一個進程有一個類型爲k的待處理信號,那麼任何接下來發送到這個進程的類型爲k的信號都不會排隊等待;它們只是被簡單的丟棄。一個進程可以有選擇性的阻塞某種信號。當一個信號被阻塞時,它仍可以被髮送,但是產生的待處理信號不會被接收,直到進程取消對這種信號的阻塞。(注意:如果兩個類型爲k的信號發送給一個目的進程,而如果目的進程當前正在執行信號k的處理程序,所以信號k被阻塞了,那麼第二個信號就簡單的丟棄了,不會排隊,關鍵思想是如果存在一個未處理的信號就表明至少有一個信號已經到達了

一個待處理信號最多隻能被接收一次。內核爲每個進程在penging爲向量中維護着待處理信號的集合,而在blocked位向量中維護着被阻塞的信號集合。只要傳送了一個類型爲k的信號,內核就會設置pending中的第k位,而只要接收了一個類型爲k的信號,內核就會清除pending中的第k位。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章