跳轉到內容

C 程式設計/signal.h

來自華夏公益教科書,開放的書籍,用於開放的世界

signal.h 是 C 標準庫中定義的一個頭檔案,用於指定程式在執行期間如何處理訊號。訊號可以報告程式中的某些異常行為(例如除以零),或者訊號可以報告程式外部的某些非同步事件(例如有人在鍵盤上按下互動式注意鍵)。

訊號可以透過呼叫 raise(向當前程序傳送訊號)或 kill(向任何程序傳送訊號)來生成。每個實現都會定義它生成(如果有)的訊號以及在什麼情況下生成它們。實現可以定義除這裡列出的訊號之外的其他訊號。標準標頭檔案 <signal.h> 可以定義以 SIG 開頭的名稱的附加宏,以指定附加訊號的值。所有這些值都是整數常量表達式 >= 0。

除了兩個訊號(SIGKILL 和 SIGSTOP 不能被捕獲、阻止或忽略)之外,可以為所有訊號指定訊號處理程式。訊號處理程式是一個函式,當發生相應訊號時,目標環境會呼叫它。目標環境會暫停程式的執行,直到訊號處理程式返回或呼叫 longjmp。為了最大限度地移植,非同步訊號處理程式只應

  • 對 signal 函式進行呼叫(成功)
  • 為 volatile sig_atomic_t 型別的物件賦值
  • 將控制權返回給它的呼叫者

如果訊號報告程式內的錯誤(並且訊號不是非同步的),訊號處理程式可以透過呼叫 abortexitlongjmp 來終止。

成員函式

[編輯 | 編輯原始碼]
  • 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
[編輯 | 編輯原始碼]
華夏公益教科書