1. 程式人生 > >Linux-信號的本質

Linux-信號的本質

產生 之間 軟件 我們 發送 故障 處理流程 完整 linu

信號的概念

  軟中斷信號(signal,又簡稱為信號)用來通知進程發生了異步事件。在軟件層次上是對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的(《中斷本質》)。信號是進程間通信機制中唯一的異步通信機制,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麽時候到達。進程之間可以互相通過系統調用kill發送軟中斷信號。內核也可以因為內部事件而給進程發送信號,通知進程發生了某個事件。信號機制除了基本通知功能外,還可以傳遞附加信息。

信號處理流程

  對於一個完整的信號生命周期(從信號發送到相應的處理函數執行完畢)來說,可以分為三個階段:信號誕生、信號在進程中註冊、信號的執行和註銷

信號發生

  信號事件的發生有兩個來源:硬件來源(比如我們按下了鍵盤或者其它硬件故障);軟件來源,最常用發送信號的系統函數是kill, raise, alarm和setitimer以及sigqueue函數,軟件來源還包括一些非法運算等操作。

信號在進程中註冊

  在進程表的表項中有一個軟中斷信號域,該域中每一位對應一個信號,當導致產生信號的事件發生時,內核就產生了一個信號。內核給一個進程發送軟中斷信號的方法,是內核在進程所在的進程表項的信號域設置對應於該信號的位,當內核設置了這個標誌,我們就說內核向進程遞送了一個信號。如果信號發送給一個正在睡眠的進程,如果進程睡眠在可被中斷的優先級上,則喚醒進程;否則僅設置進程表中信號域相應的位,而不喚醒進程。如果發送給一個處於可運行狀態的進程,則只置相應的域即可。

  收到信號的進程對各種信號有不同的處理方法。處理方法可以分為三類:

    第一種是類似中斷的處理程序,對於需要處理的信號,進程可以指定處理函數,由該函數來處理。

    第二種方法是,忽略某個信號,對該信號不做任何處理,就象未發生過一樣。

    第三種方法是,對該信號的處理保留系統的默認值,這種缺省操作,對大部分的信號的缺省操作是使得進程終止。進程通過系統調用signal來指定進程對某個信號的處理行為。

轉自:http://www.cnblogs.com/hoys/archive/2012/08/19/2646377.html

Linux-信號的本質