信号的捕捉和处理之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指定。



 

你可能感兴趣的:(信号的捕捉和处理之signaction函数)