函数原型:
#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 的定义如下:
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指定。