signal函数
/*
* @file signal.c
* @brief 简易信号捕捉
* @version 1.1 无
* @author 北豼
* @date 2022年5月11日
*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
//函数指针的定义,用于信号捕捉
typedef void (*sighandler_t) (int);
/*
* 函数名称: catchsigint
* 函数介绍: 捕捉到信号后调用的函数
* 输入参数: int signo
* 输出参数: 无
* 返回值 : 无
*/
void catchsigint(int signo)
{
printf("--------------catch\n");
}
int main(void)
{
sighandler_t handler;
//注册捕捉函数
handler = signal(SIGINT, catchsigint);
if (handler == SIG_ERR)
{
perror("signal error");
exit(1);
}
while (1);
return 0;
}
捕捉到ctrl+c的信号就执行catchsigint函数
sigaction函数
/*
* @file sigaction.c
* @brief sigaction函数注册信号捕捉函数
* @version 1.1 无
* @author 北豼
* @date 2022年5月11日
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
/*
* 函数名称: docatch
* 函数介绍: 捕捉到信号后调用的函数
* 输入参数: int signo
* 输出参数: 无
* 返回值 : 无
*/
void docatch(int signo)
{
printf("%d signal is catched\n", signo);
}
int main(void)
{
int ret;
struct sigaction act;
//设置结构体的参数
act.sa_handler = docatch;
sigemptyset(&act.sa_mask);
sigaddset(&act.sa_mask, SIGQUIT);
act.sa_flags = 0; //默认属性,信号捕捉函数执行期间,自动屏蔽本信号
//注册捕捉函数
ret = sigaction(SIGINT, &act, NULL);
if (ret < 0)
{
perror("sigaction error");
exit(1);
}
while (1);
return 0;
}
信号捕捉特性