2.26、sigaction信号捕捉函数
1.信号捕捉函数的捕捉过程
注意!!!!
- 如果信号被阻塞,那么之后再发送这相同的信号将会被忽略,也就是未决信号集不会记录个数。
- 信号在被捕捉之后会执行信号处理函数(回调函数),那么信号处理函数在执行的时候会使用临时信号集,而在回调函数执行完之后,会使用内核信号集。
2.sigaction函数
①sigaction函数的介绍
#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
struct sigaction *oldact);
- 功能:检查或者改变信号的处理。信号捕捉
- 参数:
- signum : 需要捕捉的信号的编号或者宏值(信号的名称)
- act :捕捉到信号之后的处理动作
- oldact : 上一次对信号捕捉相关的设置,一般不使用,传递NULL
- 返回值:
成功 0
失败 -1
struct sigaction {
// 函数指针,指向的函数就是信号捕捉到之后的处理函数
void (*sa_handler)(int);
// 不常用
void (*sa_sigaction)(int, siginfo_t *, void *);
// 临时阻塞信号集,在信号捕捉函数执行过程中,临时阻塞某些信号。
sigset_t sa_mask;
// 使用哪一个信号处理对捕捉到的信号进行处理
// 这个值可以是0,表示使用sa_handler,也可以是SA_SIGINFO表示使用sa_sigaction
int sa_flags;
// 被废弃掉了
void (*sa_restorer)(void);
};
②sigaction函数使用
#include <iostream>
#include <stdlib.h>
#include <signal.h>
#include <sys/time.h>
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;
// 设置信号捕捉
struct sigaction act;
act.sa_handler = myalarm;
act.sa_flags = 0;
sigemptyset(&act.sa_mask);
int retSig = sigaction(SIGALRM, &act, NULL);
if (retSig == -1)
{
perror("signal");
exit(0);
}
int ret = setitimer(ITIMER_REAL, &new_value, NULL); // 非阻塞
printf("定时器开始执行....\n");
if (ret == -1)
{
perror("setitimer");
exit(0);
}
while (1);
return 0;
}