首页 > 代码库 > 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 改进捕捉信号机制