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