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 |