跳轉到內容

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

參考文獻

[編輯 | 編輯原始碼]
[編輯 | 編輯原始碼]
華夏公益教科書