热门问题
时间线
聊天
视角
signal.h
来自维基百科,自由的百科全书
Remove ads
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()。
函式
例子
#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;
}
Remove ads
參見
參考文獻
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads