您的位置:首页 > 其它

【信号】信号捕捉之sigaction

2019-03-30 08:49 55 查看
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hello_ape/article/details/88893782

sigaction是系统提供的另一个信号处理函数。负责检查或修改指定信号的关联处理动作。函数原型如下:

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

signum是指需要处理的信号编号,act 和oldact都是结构体指针,如果不需要修改对应信号的动作,可以将act 设置为空。如果需要修改其动作(捕捉),将结构体的指针传入。oldact顾名思义,是该信号之前的处理方式,获取以前的处理方式在处理信号后,便于恢复以前的动作。

linux系统下其结构体具体信息如下:

[code]struct sigaction {
void     (*sa_handler)(int);
void     (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t   sa_mask;
int        sa_flags;
void     (*sa_restorer)(void);
};

sa_handler 是指向参数类型为int 返回值为空的函数指针,也就是信号捕捉函数的地址。如果设置为SIG_DFL则是对信号执行默认操作。如果设置为SIG_IGN则是忽略。

sa_sigaction是指向另一个信号处理函数的函数指针。

sa_mask 是一个信号集,执行信号捕捉函数期间,对sa_mask中的信号进行屏蔽

当 sa_flags 的值包含了 SA_SIGINFO 标志时,系统将使用 sa_sigaction 函数作为信号处理函数,否则使用 sa_handler 作为信号处理函数

sa_flags 可以是以下值的“按位或”组合。
 SA_RESTART:使被信号打断的系统调用自动重新发起。
SA_NOCLDSTOP:使父进程在它的子进程暂停或继续运行时不会收到 SIGCHLD 信号。
SA_NOCLDWAIT:使父进程在它的子进程退出时不会收到 SIGCHLD 信号,这时子进程如果退出也不会成为僵尸进程。
SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。
SA_RESETHAND:信号处理之后重新设置为默认的处理方式。
SA_SIGINFO:使用 sa_sigaction 成员而不是 sa_handler 作为信号处理函数。

通常 将sa_flags设置为0.

 

sa_restorer在设计之初就不是打算给用户使用的,所以编程时不关心

sigaction返回值和信号部分函数一致,成功返回0,如果出错,返回-1,errno被设置为错误原因

[code]#include "apue.h"

typedef void Sigfun(int);

void
docatch(int signo)
{
printf("docatch catch signal is %d\n",signo);
}

int
main(int argc,char **argv)
{

struct sigaction act;
act.sa_handler = docatch;
sigemptyset(&act.sa_mask);
//	sigaddset(&act.sa_mask,SIGQUIT);
act.sa_flags = 0;
if(sigaction(SIGINT,&act,NULL) == -1){
printf("sigaction error\n");
exit(1);
}
printf("sigaction success\n");
while(1);
return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐