1. 程式人生 > 其它 >Ch6 訊號和訊號處理

Ch6 訊號和訊號處理

Ch6 訊號和訊號處理

知識概要:

  • 訊號和訊號處理;
  • 訊號和中斷的統一處理
  • 將訊號視為程序中斷,將程序從正常執行轉移到訊號處理
  • 訊號的來源,包 括來自硬體、異常和其他程序的訊號
  • 訊號在Unix/Linux中的常見用法
  • Unix/Linux中的訊號處理
    • 訊號型別
    • 訊號向量位
    • 訊號掩碼位
    • 程序 PROC結構體中的訊號處理程式
    • 訊號處理步驟

6.1 訊號和中斷

  1. 中斷:從1/0裝置或協處理器傳送到CPU的外部請求,它將CPU從正常執行轉移 到中斷處理。
  2. 訊號:傳送給程序的請求,將程序從正常 執行轉移到中斷處理。

6.2 Unix/Linux訊號示例

  1. Ctrl+C組合鍵會生成一個鍵盤硬體中斷。鍵盤中斷處理程式將Ctrl+C
    組合鍵轉換為SIGINT(2)信 號,傳送給終端上的所有程序,並喚醒等待鍵盤輸入的程序。
  2. 使用者可使用nohup a.out命令在後臺執行一個程式。即使在使用者退出後,程序仍將繼續執行。nohup命令會使sh像往常一樣復刻子程序來執行程式,但是子程序會忽略 S1GHUP(1)訊號。
  3. 使用者可以使用sh命令kill pid or kill -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結構體中的訊號