信號的概念
信號在我們的生活隨處可見,如:古代戰爭中摔杯為號;代戰爭中的信號彈;體育比賽中使用的信號槍,它們都有共性:1. 簡單 2. 不能攜帶大量的信息 3. 滿足某個特定條件才發送
信號是信息的載體,Linux/UNIX環境下,古老、經典的通信方式,現在依然是主要的通信手段。
UNIX早期版本就提供了信號機制,但不可靠,信號可能丟失,Bakeley和AT&T都對信號模型做了更改,增加了可靠信號機制。但彼此不兼容。POSIX.1對可靠信號例程進行了標準化。
?
信號的機制
A給B發送了信號,B收到信號之前執行自己的代碼,收到信號后,不管執行到程序的什么位置,都要暫停運行,去處理信號,處理完畢再繼續執行,與硬件中斷類似——異步模式,但信號是軟件層面上實現的中斷,早期常被稱“軟中斷”。
信號的特征:由于信號是通過軟件方法是是實現,其實現手段導致信號有很強的延時性。但對于用戶來說,這個延遲時間非常短,不易察覺。
注意:每個進程收到的所有信號,都是由于內核負責發送的,內核處理。
?
與信號相關的事件與狀態
產生信號:
- 按鍵產生:如Ctrl + c、Ctrl + z, Ctrl + \
- 系統調用產生:如kill、raise、alarm
- 硬件異常產生:如非法訪問內存(段錯誤)、除0(浮點數除外)、內存對齊錯誤(總線錯誤)
遞達:遞送并且到達進程
未決:產生和遞達之間的狀態。主要由于阻塞(屏蔽)導致該狀態。
信號的處理方式:
- 執行默認動作:默認操作統通常是終止進程,這取決于被發送的信號
- 忽略(丟棄):不采取任何操作、有兩個信號不能忽略:SIGKILL和SIGSTOP
- 捕捉(調用用戶處理函數):內核中斷正在執行的代碼,轉去執行先前注冊過的處理程序
linux內核的進程控制塊PCB是一個結構體,task_struct,除了包含進程ID、狀態、工作目錄、用戶ID、組ID、文件描述符、還包含了信號相關的信息,主要指阻塞信號集和未決信號集。
阻塞信號集:將某些信號加入集和,對它們設置屏蔽屏蔽,當屏蔽x信號后,在收到該信號,該信號的處理退后(解除屏蔽后)
未決信號集:
- 信號產生,未決信號集中描述該信號的位立即翻轉為1, 表信號處于未決轉態。當信號被處理翻轉回為0,這一時刻往往非常短暫。
- 信號的產生后由于默寫原因(主要指阻塞)不能抵達,這類信號的集合稱之為未決信號集。在屏蔽解除前,信號一直處于未決狀態。
?
?