(1)sigaction函數:注冊一個信號捕捉函數(不參與捕捉信號,信號由內核捕捉),并修改原來的信號處理動作
(2)函數原型及頭文件
? ? ? ? ? ? ?頭文件:#include<signal.h>
? ? ? ? ? ? 函數原型:int sigaction(int signum,const struct sigaction*act,struct sigaction*oldact);
(3)返回值:成功返回值為0.失敗返回值為-1
(4)結構體參數:struct sigaction
? ? ? ? ? ?struct sigaction{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void? (*sa_handler)(int);//信號捕捉函數的函數指針
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void? (*sa_sigaction)(int ,siginfo_t*,void*);//當sa_flag==SA_SIGINFO,使用此函數
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?sigset_t sa_mask;//信號捕捉函數執行時指定的臨時信號集
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? int sa_flags;//通常設置為0,表示默認屬性,即信號捕捉函數期間自動屏蔽本信號
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?void? ? (*sa_restorer)(void);//舍棄不用
? ? ? ? ? ? ? ? ? ? ? ? };
(5)sigaction函數實現:
(6)sigaction使用注意點
? ? ? ? ?1)在信號捕捉函數執行期間,如果遇到sa_mask屏蔽信號字中的信號,則會發生阻塞,等到捕捉函數執行完畢后再處理這個信號。
? ? ? ? ?2)在信號捕捉函數執行期間,阻塞的常規信號不支持排隊,產生多次只記錄一次。如果再次發捕獲信號,則會再次進入信號捕捉函數。
? ? ? ? 3)如果在信號捕捉函數執行期間,遇到sa_mask之外的信號,則會優先執行這個信號,然后再執行信號捕捉函數(如果前面的信號沒有讓程序結束或暫停)。