Linux 改进捕捉信号机制
Posted 庖丁解牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 改进捕捉信号机制相关的知识,希望对你有一定的参考价值。
sigaction函数 sigaction函数的功能是检查或修改与指定信号相关联的处理动作,该函数取代了signal函数。 因为signal函数在信号未决时接收信号可能出现问题,所以使用sigaction更安全。 int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact); 成功返回0,失败返回-1。 参数signum是要检测或者修改其具体动作的信号编号(或同事执行这两种操作)。 如果act指针非空,则要修改其动作, 如果oact指针非空,则系统由oact指针返回该信号的上一个动作。 一般我们对信号的上一个动作并不太关心,第三个参数可以传0 struct sigaction { void (*sa_handler)(int); void (*sa_sigaction)(int, siginfo_t *, void *); sigset_t sa_mask; int sa_flags; void (*sa_restorer)(void); };
//捕捉信号 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <signal.h> void catch_signal(int sign) { switch(sign) { case SIGINT: //SIGINT默认行为是退出进程 printf("SIGINT signal\n"); exit(0); break; case SIGALRM: //SIGALRM默认行为是退出进程 printf("SIGALRM signal\n"); break; case SIGKILL: printf("SIGKILL signal\n"); break; } } //建议使用封装之后的mysignal int mysignal(int sign,void (*func)(int)) { struct sigaction act,oact; //传入回调函数 act.sa_handler=func; //将act的属性sa_mask设置一个初始值 sigemptyset(&act.sa_mask); act.sa_flags=0; return sigaction(sign,&act,&oact); } int main(int arg, char *args[]) { mysignal(SIGINT,catch_signal); mysignal(SIGALRM,catch_signal); mysignal(SIGKILL,catch_signal); int i=0; while(1) { printf("hello god %d\n",i++); sleep(1); } return 0; }
以上是关于Linux 改进捕捉信号机制的主要内容,如果未能解决你的问题,请参考以下文章