?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
在頭文件<signal.h>中定義 | ||
---|---|---|
void(* signal(int sig,void(* handler)(int)))(int); |
設(shè)置信號sig的錯誤處理程序。 可以設(shè)置信號處理程序,以便進行默認處理,忽略信號或調(diào)用用戶定義的函數(shù)。
當信號處理程序設(shè)置為函數(shù)并且發(fā)生信號時,會執(zhí)行定義信號處理程序啟動之前是否立即執(zhí)行signal(sig,SIG_DFL)。 此外,該實現(xiàn)可以防止在信號處理程序運行時發(fā)生一些實現(xiàn)定義的信號集。
sig | - | 將信號處理程序設(shè)置為的信號。它可以是實現(xiàn)定義的值或以下值之一:SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM定義信號類型(宏常量) | SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | 定義信號類型(宏常量) | |
---|---|---|---|---|---|
SIGABRTSIGFPESIGILLSIGINTSIGSEGVSIGTERM | 定義信號類型(宏常量) | ||||
handler | - | 信號處理程序。這必須是以下之一:SIG_DFL宏。信號處理程序設(shè)置為默認信號處理程序。SIG_IGN宏。信號被忽略。指向函數(shù)的指針。該函數(shù)的簽名必須等同于以下內(nèi)容:void fun(int sig); | void fun(int sig); | ||
void fun(int sig); |
SIG_DFL
宏。信號處理程序設(shè)置為默認信號處理程序。
SIG_IGN
宏。信號被忽略。
指向函數(shù)的指針。該功能的簽名必須等同于以下內(nèi)容:
void fun(int sig);
成功則返回先前的信號處理程序,或失敗時返回SIG_ERR(在某些實現(xiàn)中可以禁用信號處理程序)。
作為信號處理程序安裝的用戶定義函數(shù)受到以下限制。
如果用戶定義的函數(shù)在處理時返回SIGFPE
,SIGILL
或者SIGSEGV
則行為未定義。
如果信號處理程序由于中止或提升而被調(diào)用,那么如果信號處理程序調(diào)用提升,則行為不確定。
如果信號處理程序由于中止或提升而被調(diào)用(換句話說,信號處理程序是異步的),則行為是不確定的。
信號處理程序調(diào)用標準庫中的任何函數(shù),以下情況除外
abort
_Exit
quick_exit
signal
第一個參數(shù)是當前處理的信號的數(shù)量(異步處理程序可以重新注冊自身,但不是其他信號)。
如果原子參數(shù)是無鎖的,則從stdatomic.h派生原子函數(shù)
atomic_is_lock_free
(有任何種類的原子參數(shù))
信號處理程序引用任何靜態(tài)或線程本地(自C11)存儲持續(xù)時間的非鎖定原子(自C11開始)以外的任何對象,而不是通過分配給靜態(tài)volatile std::sig_atomic_t
。
在進入信號處理程序時,浮點環(huán)境的狀態(tài)和所有對象的值是未指定的,除了。
類型的對象 volatile
sig_atomic_t
無鎖原子類型的對象(自C11開始)
通過atomic_signal_fence
(自C11以來)可見的副作用
從信號處理程序返回時,由信號處理程序修改的非易失性sig_atomic_t或無鎖定原子(從C11開始)的任何對象的值都未定義。
如果signal
在多線程程序中使用,則行為未定義。它不需要是線程安全的。
POSIX要求這signal
是線程安全的,并且指定可以從任何信號處理程序調(diào)用的異步信號安全庫函數(shù)列表。
除了abort
和 raise
外,POSIX還指定kill,pthread_kill和sigqueue生成同步信號。
POSIX建議使用sigaction而不是signal,這是由于其信號處理器執(zhí)行時的信號傳遞方面的指定行為和重要的實現(xiàn)變化。
#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: 0Sending signal: 2SignalValue: 2
C11標準(ISO / IEC 9899:2011):
7.14.1.1信號功能(p:266-267)
C99標準(ISO / IEC 9899:1999):
7.14.1.1信號功能(p:247-248)
C89 / C90標準(ISO / IEC 9899:1990):
4.7.1.1信號功能
raise | runs the signal handler for particular signal (function) |
---|
| signal的C ++文檔 |