第二十二篇:訊號的接收和處理

穆晨發表於2017-01-28

前言

       要想掌握 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 函式。

相關文章