Ch6 訊號和訊號處理
阿新 • • 發佈:2021-11-14
Ch6 訊號和訊號處理
知識概要:
- 訊號和訊號處理;
- 訊號和中斷的統一處理
- 將訊號視為程序中斷,將程序從正常執行轉移到訊號處理
- 訊號的來源,包 括來自硬體、異常和其他程序的訊號
- 訊號在Unix/Linux中的常見用法
- Unix/Linux中的訊號處理
- 訊號型別
- 訊號向量位
- 訊號掩碼位
- 程序 PROC結構體中的訊號處理程式
- 訊號處理步驟
6.1 訊號和中斷
中斷
:從1/0裝置或協處理器傳送到CPU的外部請求,它將CPU從正常執行轉移 到中斷處理。訊號
:傳送給程序的請求,將程序從正常 執行轉移到中斷處理。
6.2 Unix/Linux訊號示例
Ctrl+C
組合鍵會生成一個鍵盤硬體中斷。鍵盤中斷處理程式將Ctrl+C
SIGINT(2)
信 號,傳送給終端上的所有程序,並喚醒等待鍵盤輸入的程序。- 使用者可使用
nohup a.out
命令在後臺執行一個程式。即使在使用者退出後,程序仍將繼續執行。nohup
命令會使sh
像往常一樣復刻子程序來執行程式,但是子程序會忽略S1GHUP(1)
訊號。 - 使用者可以使用
sh
命令kill pid
orkill -s 9 pid
殺死該程序。方法如下。-
讀者可能會問,為什麼是9號訊號呢?在最初的Unix中,只有9個 訊號。9號訊號被保留為終止程序的終極手段。雖然後來的Unix/ Linux系統將訊號編號擴 展到了 31,但是訊號編號9的含義仍然保留了下來。
-
6.3 Unix/Linux中的訊號處理
Unix/Linux支援31種不同的訊號,每種訊號在signal.h
檔案中都有定義。
每種訊號都有一個符號名,如SIGHUP(1)
、SIGEMT(2)
、SIGKILL(9)
、S1GSEGV(11)
等。
#define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SIGILL 4 #define SIGTRAP 5 #define SIGABRT 6 #define SIGIOT 6 #define SIGBUS 7 #define SIGFPE 8 #define SIGKILL 9 #define SIGUSR1 10 #define SIGSEGV 11 #define SIGUSR2 12 #define SIGPIPE 13 #define SIGALRM 14 #define SIGTERM 15 ……
-
來自硬體中斷的訊號:在程序執行過程中,一些硬體中斷被轉換為訊號傳送給程序
- 中斷鍵
Ctrl+C
,它產生一個SIGINT(2)
訊號。 - 間隔定時器,當它的時間到期時,會生成一個
SIGALRM(14)
。SIGVTALRM(26)
或SIGPROF(27)
訊號。
- 中斷鍵
-
其他硬體錯誤,如匯流排錯誤、IO陷阱等。
- 來自異常的訊號:當用戶模式下的程序遇到異常時,會陷入核心模式,生成一個訊號,併發送給自己。常見的陷阱訊號有
SIGFPE(8)
,表示浮點異常(除以0),最常 見也是最可怕的是SIGSEGV(11),表示段錯誤,等等。 - 來自其他程序的訊號:程序可使用
kill(pid, sig)
系統呼叫向pid標識的目標程序傳送訊號。
- 來自異常的訊號:當用戶模式下的程序遇到異常時,會陷入核心模式,生成一個訊號,併發送給自己。常見的陷阱訊號有
-
實踐:
在Linux中執行簡單的C程式
main()( while(1>; }
使程序無限迴圈。從另一個終端,使用
ps-u
查詢迴圈程序pid
。然後 輸入sh
命令
kill -s 11 pid
-
迴圈程序會因為段錯誤而死亡。
-
程序PROC結構體中的訊號