signal.h
signal.h
是C標準函數庫中的信號處理部分, 定義了程序執行時如何處理不同的信號。信號用作進程間通信, 報告異常行為(如除零)、用戶的一些按鍵組合(如同時按下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()
發送一個信號給特定進程。
除了兩個信號SIGKILL與SIGSTOP不能被捕獲(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;
}
參見
參考文獻
- ^ ISO/IEC 9899:1999 specification (PDF). . p. 258, § 7.14 Signal handling [2012-11-06]. (原始內容 (PDF)存檔於2011-01-24).
- ^ The Open Group Base Specifications Issue 6 - signal.h - signals. [10 January 2012]. (原始內容存檔於2012-12-12).