函數原型:
#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 的定義如下:
- struct sigaction
- {
- void(*sa_handler)(int);
- void(*sa_sigaction)(int,siginfo_t *,void *);
- sigset_t sa_mask;
- int sa_flags;
- }
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指定。