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