前言
要想掌握 Linux 系統程式設計,自然要好好學學其訊號機制。
本文介紹一個簡單的訊號接收處理程式,為後面繼續深入學習訊號機制打下基礎。
什麼是訊號
訊號是軟體中斷,它提供一種處理非同步事件的方法。
訊號產生的條件
1. 當使用者按某些終端按鍵時。比如:Ctrl + D / Ctrl + C 等。
2. 硬體異常。比如:除數為 0,無效記憶體引用等。
3. 呼叫 kill 函式可以將訊號傳送給另一個程式或者程式組。
4. 當檢測到某種軟體條件已經發生時。比如:alarm 到時,網路傳來某些帶外資料時等。
訊號處理三種方法
1. 忽略此訊號
2. 執行系統預設動作 ( 大多數訊號的預設動作是終止程式 )
3. 捕捉訊號並使用自定義的函式進行相應處理
Linux 中的各種訊號
參考 APUE 第二版 P236。
程式碼示例一:捕捉一個使用者指定訊號並列印
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <signal.h> 4 5 // 訊號處理函式( 此類函式都是無返回且形參為一個整數,該整數即為所接收到的訊號 ) 6 static void sig_usr (int); 7 8 int main (void) { 9 10 // 註冊訊號和訊號處理函式 11 if (signal(SIGUSR1, sig_usr) == SIG_ERR) 12 return 1; 13 if (signal(SIGUSR2, sig_usr) == SIG_ERR) 14 return 2; 15 16 while (1) 17 pause(); 18 19 return 0; 20 } 21 22 static void sig_usr (int signo) { 23 24 // 對訊號做出處理 25 if (signo == SIGUSR1) 26 printf("收到訊號 SIGUSR1\n"); 27 if (signo == SIGUSR2) 28 printf("收到訊號 SIGUSR2\n"); 29 }
執行測試
首先讓該程式後臺執行:
然後,向該程式分別傳送 SIGUSR1 和 SIGUSR2 訊號:
可以看到兩個訊號都被接收並列印出來了
小結
如果需要阻塞某些訊號,或者需要進行某些控制,考慮使用 sigaction 函式。