要對一個(gè)信號進(jìn)行處理,就需要給出此信號發(fā)生時(shí)系統所調用的處理函數??梢詫σ粋€(gè)特定的信號(除去SIGKILL和SIGSTOP信號)注冊相應的處理函數。注冊某個(gè)信號的處理函數后,當進(jìn)程接收到此信號時(shí),無(wú)論進(jìn)程處于何種狀態(tài),就會(huì )停下當前的任務(wù)去執行此信號的處理函數。
1、注冊信號函數。
- #include<signal.h>
要對一個(gè)信號進(jìn)行處理,就需要給出此信號發(fā)生時(shí)系統所調用的處理函數??梢詫σ粋€(gè)特定的信號(除去SIGKILL和SIGSTOP信號)注冊相應的處理函數。注冊某個(gè)信號的處理函數后,當進(jìn)程接收到此信號時(shí),無(wú)論進(jìn)程處于何種狀態(tài),就會(huì )停下當前的任務(wù)去執行此信號的處理函數。
1、注冊信號函數。
signumber表示信號處理函數對應的信號。func是一個(gè)函數指針。此函數有一整型參數,并返回void型。其實(shí)func還可以取其他定值如:SIG_IGN,SIG_DFL.
SIG_IGN表示:忽略signumber所指出的信號。SIG_DFL表示表示調用系統默認的處理函數。signal函數的返回值類(lèi)型同參數func,是一個(gè)指向某個(gè)返回值為空并帶有一個(gè)整型參數的函數指針。其正確返回值應為上次該信號的處理函數。錯誤返回SIG_ERR
signal示例如下:
通常情況下一個(gè)用戶(hù)進(jìn)程需要處理多個(gè)信號??梢栽谝粋€(gè)程序中注冊多個(gè)信號處理函數。一個(gè)信號可以對應一個(gè)處理函數,同時(shí)多個(gè)信號可以對應一個(gè)處理函數。
對于SIGINT信號 我們可以用ctrl+c或ctrl+z來(lái)中斷進(jìn)程,來(lái)執行SIGINT注冊的函數。
2、 高級信號處理。
在linux系統提供了一個(gè)功能更強的系統調用。
此函數除能注冊信號函數外還提供了更加詳細的信息,確切了解進(jìn)程接收到信號,發(fā)生的具體細節。
struct sigaction的定義如下:在linux2.6.39/include/asm-generic/signal.h中實(shí)現
siginfo_t在linux2.6.39/include/asm-generic/siginfo.h中實(shí)現:
sa_flags的取值如下表,取0表示選用所有默認選項。
SA_NOCLDSTOP:用于表示信號SIGCHLD,當子進(jìn)程被中斷時(shí),不產(chǎn)生此信號,當且僅當子進(jìn)程結束時(shí)產(chǎn)生此信號。
SA_NOCLDWATI:當信號為SIGCHLD,時(shí)可避免子進(jìn)程僵死。
SA_NODEFER:當信號處理函數正在進(jìn)行時(shí),不堵塞對于信號處理函數自身信號功能。
SA_NOMASK:同SA_NODEFER
SA_ONESHOT:當用戶(hù)注冊的信號處理函數被執行過(guò)一次后,該信號的處理函數被設為系統默認的處理函數。
SA_RESETHAND:同SA_ONESHOT
SA_RESTART:是本來(lái)不能重新于運行的系統調用自動(dòng)重新運行。
SA_SIGINFO:表明信號處理函數是由SA_SIGACTION指定的,而不是由SA_HANDLER指定的,它將顯示更多的信號處理函數信息。
其實(shí)sinaction完全可以替換signal函數


聯(lián)系客服