理论基础课看链接: 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;
}