2.23、signal信号捕捉函数
1.signal函数使用介绍
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
- 功能:设置某个信号的捕捉行为
- 参数:
- signum: 要捕捉的信号
- handler: 捕捉到信号要如何处理
- SIG_IGN : 忽略信号
- SIG_DFL : 使用信号默认的行为
- 回调函数 : 这个函数是内核调用,程序员只负责写,捕捉到信号后如何去处理信号。
回调函数:
- 需要程序员实现,提前准备好的,函数的类型根据实际需求,看函数指针的定义
- 不是程序员调用,而是当信号产生,由内核调用
- 函数指针是实现回调的手段,函数实现之后,将函数名放到函数指针的位置就可以了。
- 返回值:
成功,返回上一次注册的信号处理函数的地址。第一次调用返回NULL
失败,返回SIG_ERR,设置错误号
SIGKILL SIGSTOP不能被捕捉,不能被忽略。
2.signal函数实现
捕捉函数一定得在信号传递之前创建
#include <iostream>
#include <sys/time.h>
#include <signal.h>
#include <cstdlib>
using namespace std;
// 实现回调函数
void myalarm(int num)
{
cout << "num is " << num << endl;
cout << "xxxxxx" << endl;
}
int main()
{
//设置3秒之后,每隔2秒设置发送一个信号
struct itimerval new_value = {{2, 0}, {3, 0}};
// struct itimerval new_value;
// 设置间隔时间
// new_value.it_interval.tv_sec = 2;
// new_value.it_interval.tv_usec = 0;
// 设置延迟间隔时间
// new_value.it_value.tv_sec = 3;
// new_value.it_value.tv_usec = 0;
sighandler_t retSig = signal(SIGALRM, myalarm);
if (retSig == SIG_ERR)
{
perror("signal");
exit(0);
}
int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞
printf("定时器开始执行....\n");
if (ret == -1)
{
perror("setitimer");
exit(0);
}
getchar();
return 0;
}