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). 

外部連結 編輯