信號的捕捉和處理之signaction函數

函數原型:

  #include <signal.h>

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact);

sigaction會根據參數signum指定的信號編號來設置該信號的處理函數。參數signum可以是SIGKILL和SIGSTOP以外的任何信號。如果參數act不是空指針,則爲signum設置新的信號處理函數;如果oldact不是空指針,則舊的信號處理函數將被存儲在oldact中。

struct sigaction 的定義如下:

  1. struct sigaction  
  2.   
  3. {  
  4.   
  5.      void(*sa_handler)(int);  
  6.   
  7.      void(*sa_sigaction)(int,siginfo_t *,void *);  
  8.   
  9.      sigset_t  sa_mask;  
  10.   
  11.      int  sa_flags;  
  12.   
sa_handler和sa_sigaction在某些體系結構上被定義爲共用體,即這兩個值在某一時刻只有一個有效;

sa_handler可以是常量SIG_IGN,SIG_DFL,也可是一個信號處理函數的函數名。信號處理函數只有一個參數即信號編號。

       sa_sigaction一般不使用。

       sa_mask成員聲明瞭一個信號集,在調用信號捕捉函數之前,該信號集會增加到進程的信號屏蔽碼中。新的信號屏蔽碼會自動包括正在處理的信號(sa_flags未指定SA_NODEFER和SA_NOMASK)。當從信號捕捉函數返回時,進程的信號屏蔽碼會恢復爲原來的值。因此,當處理一個給定的信號時,如果這種信號再次發生,那麼他會被阻塞直到本次信號處理結束爲止。若這種信號發生了多次,則對於不可靠信號,它只會阻塞一次,即本次信號處理結束以後只會再處理一次(相當於丟失了信號);對於可靠信號(實時信號),則會被阻塞多次,即信號不會丟失,信號發生了多少次就會調用處理函數多少次。

       sa_flags的取值如下表,取0表示選用所有默認選項。

SA_NOCLDSTOP:如果參數signum爲SIGCHLD,當子進程被中斷時,並不通知父進程。

SA_NOCLDWATI:當信號爲SIGCHLD,時可避免子進程僵死。

SA_NODEFER:當信號處理函數正在進行時,不堵塞對於信號處理函數自身信號功能。

SA_NOMASK:同SA_NODEFER,在處理此信號前允許信號再次遞送,相當於中斷嵌套。

SA_ONESHOT:當用戶註冊的信號處理函數被執行過一次後,該信號的處理函數被設爲系統默認的處理函數。

SA_RESETHAND:同SA_ONESHOT

SA_RESTART:是本來不能重新於運行的系統調用自動重新運行。

SA_SIGINFO:如果設置了該標誌,則信號處理函數由三參數的sa_sigaction指定而不是sa_handler指定。



 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章