![]() |
|||||||||||||||||||||||||||||||||
Linux下的信號機制 |
|||||||||||||||||||||||||||||||||
本文關鍵字: linux 管道通信,linux 進程通信方式,信號 信號是在軟件層次上對中斷機制的一種模擬。在原理上,一個進程收到一個信號與處理器收到一個中斷請求可以說是一樣的。信號是異步的,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什么時候到達。信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。它可以在任何時候發給某一進程,而無須知道該進程的狀態。如果該進程當前并未處于執行態,則該信號就由內核保存起來,直到該進程恢復執行再傳遞給它為止;如果一個信號被進程設置為阻塞,則該信號的傳遞被延遲,直到其阻塞被取消時才被傳遞給進程。 信號是進程間通信機制中唯一的異步通信機制,可以看做是異步通知,通知接收信號的進程有哪些事情發生了。信號機制經過Posix實時擴展后,功能更加強大,除了基本通知功能外,還可以傳遞附加信息。 信號事件的發生有兩個來源:硬件來源(如我們按下了鍵盤上的按鈕或者出現其他硬件故障);軟件來源,常用發送信號的系統函數有kill()、raise()、alarm()、setitimer()和sigqueue()等,軟件來源還包括一些非法運算等操作。 進程可以通過3種方式來響應一個信號。 1.忽略信號 忽略信號即對信號不做任何處理,其中,有兩個信號不能忽略:SIGKILL和SIGSTOP。 2.捕捉信號 定義信號處理函數,當信號發生時,執行相應的處理函數。 3.執行默認操作 Linux對每種信號都規定了默認操作,如表1所示。 表1 常見信號的含義及其默認操作
一個完整的信號生命周期可以分為3個重要階段,這3個階段由4個重要事件來刻畫的:信號產生、信號在進程中注冊、信號在進程中注銷、執行信號處理函數。這里信號的產生、注冊、注銷等是指信號的內部實現機制,而不是信號的函數實現。因此,信號注冊與否與本節后面講到的發送信號函數(如kill()等)及信號安裝函數(如signal()等)無關,只與信號值有關。 相鄰兩個事件的時間間隔構成信號生命周期的一個階段。要注意這里的信號處理有多種方式,一般是由內核完成的,當然也可以由用戶進程來完成,故在此沒有明確指出。 信號的處理包括信號的發送、捕獲及信號的處理,它們有各自相對應的常見函數。 ● 處理信號的函數:signal()、sigaction()。 本文選自華清遠見嵌入式培訓教材《從實踐中學嵌入式Linux應用程序開發》 熱點鏈接:
1、有名管道(FIFO) |