名稱空間
變體
操作

signal

來自 cppreference.com
< c‎ | program
定義於標頭檔案 <signal.h>
void (*signal( int sig, void (*handler) (int))) (int);

設定訊號 sig 的錯誤處理器。訊號處理器可以設定為預設處理、忽略訊號或呼叫使用者定義函式。

當訊號處理器設定為函式並且訊號發生時,在訊號處理器啟動之前是否立即執行 signal(sig, SIG_DFL) 是實現定義的。此外,在訊號處理器執行時,實現可以阻止某些實現定義的訊號集發生。

目錄

[編輯] 引數

sig - 要設定訊號處理器的訊號。它可以是實現定義的值或以下值之一
定義訊號型別
(宏常量) [編輯]
處理程式 - 訊號處理器。這必須是以下之一
  • SIG_DFL 宏。訊號處理器設定為預設訊號處理器。
  • SIG_IGN 宏。訊號被忽略。
  • 指向函式的指標。函式的簽名必須等同於以下
void fun(int sig);

[編輯] 返回值

成功時返回先前的訊號處理器,失敗時返回 SIG_ERR(在某些實現上可能停用設定訊號處理器)。

[編輯] 訊號處理器

對作為訊號處理器安裝的使用者定義函式施加以下限制。

如果使用者定義函式在處理 SIGFPESIGILLSIGSEGV 時返回,則行為未定義。

如果訊號處理器是由於 abortraise 而被呼叫的,並且訊號處理器又呼叫了 raise,則行為未定義。

如果訊號處理器不是由於 abortraise 而被呼叫的(換句話說,訊號處理器是非同步的),則行為未定義,如果

  • 訊號處理器呼叫標準庫中的任何函式,除了
  • abort
  • _Exit
  • quick_exit
  • signal,其第一個引數是當前正在處理的訊號編號(非同步處理器可以重新註冊自身,但不能註冊其他訊號)。
  • 來自 <stdatomic.h> 的原子函式,如果原子引數是無鎖的。
  • atomic_is_lock_free(使用任何型別的原子引數)
  • 訊號處理器引用任何具有靜態 或執行緒區域性(從 C11 開始) 儲存期 的物件,如果它不是無鎖的 原子 物件(從 C11 開始),除非透過賦值給靜態 volatile sig_atomic_t

進入訊號處理器時,浮點環境的狀態和所有物件的值都是未指定的,除了

從訊號處理器返回時,任何由訊號處理器修改的、不是 volatile sig_atomic_t 或無鎖原子(從 C11 開始) 的物件的值都是未定義的。

如果在多執行緒程式中使用 signal,則行為未定義。它不要求是執行緒安全的。

[編輯] 注意

POSIX 要求 signal 是執行緒安全的,並 指定了一份非同步訊號安全庫函式列表,這些函式可以從任何訊號處理器中呼叫。

除了 abortraise,POSIX 規定 killpthread_killsigqueue 會生成同步訊號。

POSIX 建議使用 sigaction 而不是 signal,因為它在訊號處理器執行期間的訊號傳遞行為未明確指定,並且存在顯著的實現差異。

[編輯] 示例

#include <signal.h>
#include <stdio.h>
 
volatile sig_atomic_t gSignalStatus;
 
void signal_handler(int signal)
{
  gSignalStatus = signal;
}
 
int main(void)
{
  signal(SIGINT, signal_handler);
 
  printf("SignalValue: %d\n", gSignalStatus);
  printf("Sending signal: %d\n", SIGINT);
  raise(SIGINT);
  printf("SignalValue: %d\n", gSignalStatus);
}

輸出

SignalValue: 0
Sending signal: 2
SignalValue: 2

[編輯] 參考

  • C17 標準 (ISO/IEC 9899:2018)
  • 7.14.1.1 The signal function (p: 193-194)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.14.1.1 The signal function (p: 266-267)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.14.1.1 The signal function (p: 247-248)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.7.1.1 The signal function

[編輯] 另請參閱

為特定訊號執行訊號處理程式
(函式) [編輯]
C++ 文件 for signal