一、signal和sigaction信号捕捉函数
sighandler_t signal(int signum, sighandler_t handler);
其功能为设置某个信号的捕捉行为
参数:signum为要捕捉的信号,handler为捕捉到信号要如何处理
SIG_IGN:忽略信号
SIG_DEF:使用信号默认的行为
指定函数地址:信号捕捉函数
返回值
成功:返回上一次注册的信号处理函数的地址。第一次调用NULL。
失败:返回SIG_ERR,设置错误号
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);
};
二、signal使用
#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
#include <signal.h>
void myalarm(int num)
{
printf("捕捉到了信号的编号是:%d\n",num);
printf("xxxxxx\n");
}
//过三秒以后,每隔2秒定时一次
int main()
{
//注册信号捕捉
//signal(SIGALRM,SIG_IGN);
//signal(SIGALRM,SIG_DFL);
//void (*sighandler_t)(int);函数指针,int类型参数表示捕捉到信号的值
signal(SIGALRM,myalarm);
struct itimerval new_value;
//设置间隔的时间
new_value.it_interval.tv_sec=2;
new_value.it_interval.tv_usec=0;
//设置延迟的时间,3秒之后开始第一次定时
new_value.it_value.tv_sec=3;
new_value.it_value.tv_usec=0;
int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞
printf("定时器开始了。。。\n");
if(ret==-1)
{
perror("setitimer");
exit(0);
}
getchar();
return 0;
}
三、sigaction使用
#include<stdio.h>
#include<stdlib.h>
#include <sys/time.h>
#include <signal.h>
void myalarm(int num)
{
printf("捕捉到了信号的编号是:%d\n",num);
printf("xxxxxx\n");
}
//过三秒以后,每隔2秒定时一次
int main()
{
struct sigaction act;
act.sa_flags=0;
act.sa_handler=myalarm;
sigemptyset(&act.sa_mask);//设置临时阻塞信号集
//注册信号捕捉
sigaction(SIGALRM,&act,NULL);
struct itimerval new_value;
//设置间隔的时间
new_value.it_interval.tv_sec=2;
new_value.it_interval.tv_usec=0;
//设置延迟的时间,3秒之后开始第一次定时
new_value.it_value.tv_sec=3;
new_value.it_value.tv_usec=0;
int ret = setitimer(ITIMER_REAL,&new_value,NULL);//非阻塞
printf("定时器开始了。。。\n");
if(ret==-1)
{
perror("setitimer");
exit(0);
}
//getchar();
while(1);
return 0;
}
总结
今天,我介绍了signal和sigaction信号捕捉函数,其功能类似,区别是sigaction可以设置非阻塞。推荐使用sigaction函数,signal函数不兼容许多操作系统。