signal
來自 cppreference.com
定義於標頭檔案 <signal.h> |
||
void (*signal( int sig, void (*handler) (int))) (int); |
||
設定訊號 sig
的錯誤處理器。訊號處理器可以設定為預設處理、忽略訊號或呼叫使用者定義函式。
當訊號處理器設定為函式並且訊號發生時,在訊號處理器啟動之前是否立即執行 signal(sig, SIG_DFL) 是實現定義的。此外,在訊號處理器執行時,實現可以阻止某些實現定義的訊號集發生。
目錄 |
[編輯] 引數
sig | - | 要設定訊號處理器的訊號。它可以是實現定義的值或以下值之一
| ||||||
處理程式 | - | 訊號處理器。這必須是以下之一
|
[編輯] 返回值
成功時返回先前的訊號處理器,失敗時返回 SIG_ERR(在某些實現上可能停用設定訊號處理器)。
[編輯] 訊號處理器
對作為訊號處理器安裝的使用者定義函式施加以下限制。
如果使用者定義函式在處理 SIGFPE、SIGILL 或 SIGSEGV 時返回,則行為未定義。
如果訊號處理器是由於 abort 或 raise 而被呼叫的,並且訊號處理器又呼叫了 raise,則行為未定義。
如果訊號處理器不是由於 abort 或 raise 而被呼叫的(換句話說,訊號處理器是非同步的),則行為未定義,如果
- 訊號處理器呼叫標準庫中的任何函式,除了
- abort
- _Exit
- quick_exit
-
signal
,其第一個引數是當前正在處理的訊號編號(非同步處理器可以重新註冊自身,但不能註冊其他訊號)。 - 來自
<stdatomic.h>
的原子函式,如果原子引數是無鎖的。 - atomic_is_lock_free(使用任何型別的原子引數)
- 訊號處理器引用任何具有靜態 或執行緒區域性(從 C11 開始) 儲存期 的物件,如果它不是無鎖的 原子 物件(從 C11 開始),除非透過賦值給靜態 volatile sig_atomic_t。
進入訊號處理器時,浮點環境的狀態和所有物件的值都是未指定的,除了
- volatile sig_atomic_t 型別的物件
- 無鎖原子型別的物件 (從 C11 開始)
- 透過 atomic_signal_fence 可見的副作用 (從 C11 開始)
從訊號處理器返回時,任何由訊號處理器修改的、不是 volatile sig_atomic_t 或無鎖原子(從 C11 開始) 的物件的值都是未定義的。
如果在多執行緒程式中使用 signal,則行為未定義。它不要求是執行緒安全的。
[編輯] 注意
POSIX 要求 signal
是執行緒安全的,並 指定了一份非同步訊號安全庫函式列表,這些函式可以從任何訊號處理器中呼叫。
除了 abort
和 raise
,POSIX 規定 kill
、pthread_kill
和 sigqueue
會生成同步訊號。
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
|