首页 > 代码库 > Linux 改进捕捉信号机制
Linux 改进捕捉信号机制
sigaction函数sigaction函数的功能是检查或修改与指定信号相关联的处理动作,该函数取代了signal函数。因为signal函数在信号未决时接收信号可能出现问题,所以使用sigaction更安全。int sigaction(int signum, const struct sigaction *act,struct sigaction *oldact);成功返回0,失败返回-1。参数signum是要检测或者修改其具体动作的信号编号(或同事执行这两种操作)。如果act指针非空,则要修改其动作,如果oact指针非空,则系统由oact指针返回该信号的上一个动作。一般我们对信号的上一个动作并不太关心,第三个参数可以传0struct 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; }}//建议使用封装之后的mysignalint 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 改进捕捉信号机制
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。