信号的捕捉和处理之signaction函数
2012-03-14 18:47
169 查看
函数原型:
#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和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指定。
#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和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指定。
相关文章推荐
- 第十三节.Shell日志处理和信号捕捉
- 捕捉段错误信号信号处理程序
- siginalExample.c(使用signal和sigaction函数捕捉和处理信号)
- Linux 有问必答:如何在Perl中捕捉并处理信号
- 信号——产生、处理、捕捉、接收、阻塞
- //捕捉段错误信号的信号处理程序
- C++ wait捕捉的信号处理WIFEXITED/WEXITSTATUS/WIFSIGNALED
- 信号的捕捉和处理
- 捕捉段错误信号信号处理程序
- 【golang】信号捕捉和处理
- shell 信号捕捉处理
- Linux信号捕捉及其处理
- 2信号处理之:信号产生原因,进程处理信号行为,信号集处理函数,PCB的信号集,sigprocmask()和sigpending(),信号捕捉设定,sigaction,C标准库信号处理函数,可重入函数,
- shell中trap捕捉到信号的处理
- sigaction 读取和修改与指定信号相关联的处理动作 捕捉信号ctr+c
- 调用信号处理程序被捕捉的信号自动地加到进程的当前信号屏蔽字中signal() sigpending()
- shell中trap捕捉到信号的处理
- shell捕捉信号,重定向信号处理函数
- 设置信号信号处理函数void (*signal (int signo ,void (*fun)(int )))(int)
- 信号处理函数陷阱:调用malloc导致死锁