#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不能被捕捉,不能被忽略。
明白了上述各个指令的意思后就可以书写代码了。
以下代码实现的功能是首先发送一个信号“开始计时了...”,然后等待3秒后,每2秒发送一次信号“捕捉到的信号是:14.XXXXXXX”.
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <sys/time.h>
4 #include <unistd.h>
5 #include <signal.h>
6 void show(int num)
7 {
8 printf("捕捉到的信号是:%d\n",num);
9 printf("XXXXXXXXX\n");
10
11 }
12 int main()
13 {
14 signal(SIGALRM,show);
15 struct itimerval new_val;
16 //设置间隔时间
17 new_val.it_interval.tv_sec=2;
18 new_val.it_interval.tv_usec=0;
19 //设置延长时间,3秒之后第一次定时
20 new_val.it_value.tv_sec=3;
21 new_val.it_value.tv_usec=0;
22 int val=setitimer(ITIMER_REAL,&new_val,NULL);//非阻塞
23 if(val==-1)
24 {
25 perror("setitimer");
26 exit(0);
27 }
28 printf("开始计时了...\n");
29 while(1)
30 {}
31 return 0;
32 }
输出结果为:
觉得不错就点个赞吧。