linux下sigaction函数捕获信号的实战例子

理论基础课看链接: https://blog.csdn.net/weixin_42569526/article/details/107848391.

关于sigaction捕获函数:

linux系统下,输入man sigaction,可以看到这个函数的原型:

 struct sigaction {
      void     (*sa_handler)(int);//函数指针
      void     (*sa_sigaction)(int, siginfo_t *, void *);
      sigset_t   sa_mask;//执行捕捉函数期间,临时屏蔽的信号集
      int        sa_flags;//一般填0,SA_SIGINO会使用第二个函数指针
      void     (*sa_restorer)(void);//无效
};
//那么我们如何注册一个捕捉函数呢?
//如下:

int sigaction(int signum,const struct sigaction *act,struct sigaction *oldact)
//signum  捕捉的信号
//act  传入的动作
//oldact  原来系统设置的动作

实战例子如下,记得查看注释,注释里说明比较详细

#include<stdio.h>
#include<unistd.h>
#include<sys/stat.h>
#include<sys/types.h>//这两头文件可以通过man 2 kill命令查看,是kill命令所需要的
#include<signal.h>
void catch_sig(int num)
{
    //num
    printf("begin call ,catch %d sig\n",num);
    sleep(5);
    printf("end call,catch%d sig\n",num);
    //定义捕捉完信号后的处理函数,sleep5秒模拟处理函数所需要的时间
}
int main()
{
    struct sigaction act;
    act.sa_flags=0;
    sigemptyset(&act.sa_mask);
    //先清空屏蔽信号集,防止意外

    sigaddset(&act.sa_mask,SIGQUIT);//临时屏蔽Ctrl+\信号,等捕捉函数执行完之后就会执行被屏蔽的此信号
    //如果不加的话按住Ctrl+c后按Ctrl+\就会马上退出函数
    //加了后:先按Ctlr+c(捕捉到后),此时按Ctrl+\会等待捕捉函数执行完自动取消屏蔽然后执行退出

    act.sa_handler=catch_sig;
    //此处声明捕捉到信号后要执行的信号

    sigaction(SIGINT,&act,NULL);
    //此处注册捕捉函数,第三个动作为空,表明不需要系统的默认旧动作
    //SIGINT:程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

    while(1)
    {
        printf("who can kill me?\n");
        sleep(1);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42569526/article/details/107855647