signal.hC標準函式庫中的訊號處理部分, 定義了程式執行時如何處理不同的訊號。訊號用作行程間通訊, 報告異常行為(如除零)、用戶的一些按鍵組合(如同時按下Ctrl與C鍵,產生訊號SIGINT)。

C++中的對應標頭檔是csignal

標準訊號

編輯

C語言標準定義了6個訊號。都定義在signal.h標頭檔中[1]

  • SIGABRT - 異常中止。
  • SIGFPE - 浮點異常。
  • SIGILL - 無效指令。
  • SIGINT - 互動的用戶按鍵請求,預設情況下,這會導致行程終止。
  • SIGSEGV - 無效主記憶體訪問。
  • SIGTERM - 程式的中止請求。

signal.h可能還定義了其它訊號,這依賴於具體實現。例如,類Unix系統還定義了15個以上的訊號[2]Visual C++的C標準庫只支援C語言標準規定的6個訊號,即對訊號處理只提供最小的支援。

訊號處理

編輯

庫函數raise()或者系統呼叫kill()可以產生訊號。raise()傳送一個訊號給當前行程,kill()傳送一個訊號給特定行程。

除了兩個訊號SIGKILLSIGSTOP不能被擷取(caught)、阻塞(blocked)或者忽略,其它的訊號都可以指定處理常式(handler)。一個訊號的處理常式在訊號到達時,被目標環境呼叫。目標環境掛起當前行程的執行,直到訊號處理常式返回或者呼叫了longjmp()。為了最大的相容性,非同步訊號處理只應:

  • 成功呼叫了signal()指定的函數;
  • 給類型為sig_atomic_t的對象賦值;
  • 把控制返回給它的呼叫者。

如果訊號報告了行程的錯誤,訊號處理常式應該呼叫abort(), exit()longjmp()

函數

編輯
函數 描述
raise 人工投擲一個訊號
signal 當程式收到特定訊號時應該執行的處理常式

例子

編輯
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

static void catch_function(int signal) {
    puts("Interactive attention signal caught.");
}

int main(void) {
    if (signal(SIGINT, catch_function) == SIG_ERR) {
        fputs("An error occurred while setting a signal handler.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Raising the interactive attention signal.");
    if (raise(SIGINT) != 0) {
        fputs("Error raising the signal.\n", stderr);
        return EXIT_FAILURE;
    }
    puts("Exiting.");
    return 0;
}

參見

編輯

參考文獻

編輯
  1. ^ ISO/IEC 9899:1999 specification (PDF). . p. 258, § 7.14 Signal handling [2012-11-06]. (原始內容 (PDF)存檔於2011-01-24). 
  2. ^ The Open Group Base Specifications Issue 6 - signal.h - signals. [10 January 2012]. (原始內容存檔於2012-12-12). 

外部連結

編輯