C 程式設計/signal.h
signal.h 是 C 標準庫中定義的標頭檔案,用於指定程式在執行期間如何處理訊號。訊號可以報告程式中的一些異常行為(例如除以零),或者訊號可以報告程式外部的一些非同步事件(例如,有人在鍵盤上敲擊互動式注意鍵)。
可以透過呼叫 raise(向當前程序傳送訊號)或 kill(向任何程序傳送訊號)來生成訊號。每個實現都定義了它生成的訊號(如果有)以及在什麼情況下生成它們。實現可以定義除這裡列出的訊號之外的其他訊號。標準標頭檔案 <signal.h> 可以定義以 SIG 開頭的其他宏,以指定其他訊號的值。所有這些值都是大於等於 0 的整型常量表達式。
除了兩個訊號(SIGKILL 和 SIGSTOP 不能捕獲、阻塞或忽略)之外,所有訊號都可以指定訊號處理程式。訊號處理程式是目標環境在發生相應訊號時呼叫的函式。目標環境會掛起程式的執行,直到訊號處理程式返回或呼叫 longjmp。為了最大限度的可移植性,非同步訊號處理程式應該只
- 呼叫(成功)signal 函式
- 為 volatile
sig_atomic_t型別的物件賦值 - 將控制權返回給呼叫者
如果訊號報告了程式中的錯誤(並且訊號不是非同步的),則訊號處理程式可以透過呼叫 abort、exit 或 longjmp 來終止。
int raise(int sig)。這會人為地引發一個訊號。它會導致生成訊號 sig。sig 引數與 SIG 宏相容。如果呼叫成功,則返回零。否則返回一個非零值。
示例
#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;
}
psignal(int sig, const char *s),向 stderr 輸出訊號編號的字串表示形式。它存在於 4.3BSD、Solaris 和 Linux 中,但沒有在 POSIX 或 Single UNIX Specification 中指定。
在相同的系統上,string.h 包含非標準的 strsignal(int sig),其操作類似於 strerror。
void (* signal(int sig, void (*func)(int)) )(int),設定當程式接收到訊號sig時採取的操作。如果 func 的值為 SIG_DFL,則將發生該訊號的預設處理。如果 func 的值為 SIG_IGN,則該訊號將被忽略。否則,func 指向一個訊號處理程式函式,該函式將在訊號發生時被呼叫。
func 函式可以透過執行 return 語句或呼叫 abort、exit 或 longjmp 函式來終止。如果 func 執行 return 語句,並且 sig 的值為 SIGFPE 或任何其他與計算異常相對應的實現定義的值,則行為未定義。否則,程式將在被中斷的位置恢復執行。如果函式返回,並且可以滿足返回請求,則 signal 函式將返回 func 的值,該值為最近一次針對指定訊號 sig 呼叫 signal 的值。否則返回 SIG_ERR 的值,並將一個正值儲存在 errno 中。
如果訊號發生,不是由於呼叫 abort 或 raise 函式而導致的,如果訊號處理程式呼叫標準庫中的任何函式(除了 signal 函式本身(第一個引數為與導致呼叫處理程式的訊號相對應的訊號編號)之外,或者引用除透過將值分配給 volatile sig_atomic_t 型別的靜態儲存時效變數之外的任何具有狀態儲存時效的物體,則行為未定義。此外,如果對 signal 函式的此類呼叫導致 SIG_ERR 返回,則 errno 的值是不確定的。[1]
typedef i-type sig_atomic_t
- SIG_DFL - 用於設定預設訊號處理。
- SIG_IGN - 用於透過忽略來處理訊號。
- SIG_ERR - 用於錯誤的數字。
| 常量 | 含義 | 系統 |
|---|---|---|
| SIGHUP | 掛起 | POSIX |
| SIGINT | 中斷 | ANSI |
| SIGQUIT | 退出 | POSIX |
| SIGILL | 非法指令 | ANSI |
| SIGABRT | 中止 | ANSI |
| SIGTRAP | 跟蹤陷阱 | POSIX |
| SIGABRT | IOT 陷阱 | 4.2 BSD |
| SIGEMT | EMT 陷阱 | 4.2 BSD |
| SIGINFO | 資訊 | 4.2 BSD |
| SIGFPE | 浮點異常 | ANSI |
| SIGKILL | 殺死,不可阻塞 | POSIX |
| SIGBUS | 匯流排錯誤 | 4.2 BSD |
| SIGSEGV | 段錯誤 | ANSI |
| SIGSYS | 系統呼叫引數錯誤 | 4.2 BSD |
| SIGPIPE | 管道破損 | POSIX |
| SIGALRM | 鬧鐘 | POSIX |
| SIGTERM | 終止 | ANSI |
| SIGUSR1 | 使用者定義的訊號 1 | POSIX |
| SIGUSR2 | 使用者定義的訊號 2 | POSIX |
| SIGCHLD | 子程序狀態已改變 | POSIX |
| SIGCLD | 與 SIGCHLD 相同 | System V |
| SIGPWR | 電源故障重啟 | System V |
| SIGXCPU | 超過 CPU 時間 | POSIX |
| SIGSTOP | 暫停執行 | POSIX |
| SIGCONT | 恢復執行 | POSIX |