/*
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
-功能:设置捕捉某个信号的处理行为
(话说和 C++、Java 当中的捕捉异常并处理真的好像
-参数:要捕捉的信号
-handler 捕捉到的信号应该如何处理
-SIG_IGN:忽略捕捉到的信号,跟没产生信号一样
-SIG_DFL:执行信号的默认行为,跟没捕捉信号一样
-回调函数:由内核去调用,程序员只负责写,如何去处理这个信号
需要程序员自行提前写好,函数的类型根据实际需求。看函数指针的定义
不是程序员调用,当信号产生,由内核(框架)调用。
函数指针是实现回调的手段。只要将写好的函数名,放入函数指针的位置便可
-返回值:
成功,返回上一次注册的信号处理函数的地址(上一次调用该函数提供的解决方案的地址)
失败:返回SIG_ERR ,并且设置 erron
SIGKILL SIGSTOP 不能被捕捉,也不能被忽略
*/
#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
//过 3 秒后,每隔两秒钟定时一次
int main(void){
//注册信号捕捉
//(必须得先写好,否则等信号来了就来不及了,和捕捉小动物需要设立陷阱是一个道理)
signal(SIGALRM,SIG_IGN);
//使用 SIG_IGN 像没有产生信号一样,程序不会挂
struct itimerval new_value;
//设置值
//设置每隔2秒
new_value.it_interval.tv_sec = 2;
new_value.it_interval.tv_usec = 0;
//总的时间是 sec + usec
//设置延迟的时间
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_usec = 0;
int ret = setitimer(ITIMER_REAL,&new_value,NULL);
//是非阻塞的
printf("clock is starting.\n");
//如果需要让这个定时器循环的发挥作用,程序需要能够捕捉这个定时器发送的信号
//并且做出相应的对应的行动。
//就像人在自己有情绪的时候,需要对自己的情绪和行为重定向
if(ret == -1){
perror("setitimer");
exit(0);
}
getchar();
}
使用 SIG_IGN 作为信号处理方式的结果
使用 SIG_DFL 作为信号处理的结果
自定义捕捉信号的函数
#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include <signal.h>
//过 3 秒后,每隔两秒钟定时一次
void myalarm(int sig){
printf("捕捉到的信号的编号是 %d 。\n",sig);
printf("XXXXXXXXX");
}
int main(void){
//注册信号捕捉
//(必须得先写好,否则等信号来了就来不及了,和捕捉小动物需要设立陷阱是一个道理)
//signal(SIGALRM,SIG_IGN);
//使用 SIG_IGN 像没有产生信号一样,程序不会挂
//signal(SIGALRM,SIG_DFL);
signal(SIGALRM,myalarm);
struct itimerval new_value;
//设置值
//设置每隔2秒
new_value.it_interval.tv_sec = 2;
new_value.it_interval.tv_usec = 0;
//总的时间是 sec + usec
//设置延迟的时间
new_value.it_value.tv_sec = 3;
new_value.it_value.tv_usec = 0;
int ret = setitimer(ITIMER_REAL,&new_value,NULL);
//是非阻塞的
printf("clock is starting.\n");
//如果需要让这个定时器循环的发挥作用,程序需要能够捕捉这个定时器发送的信号
//并且做出相应的对应的行动。
//就像人在自己有情绪的时候,需要对自己的情绪和行为重定向
if(ret == -1){
perror("setitimer");
exit(0);
}
getchar();
}
运行结果
补充内容:函数指针
1、什么是函数指针?
函数在内存中会有一块地址,指向那个分配地址的空间的指针就是函数指针。
2、如何定义一个函数指针?
函数返回值 (*函数指针名)(函数参数列表)
3、函数指针的注意事项有哪些?
1)函数指针名 和 * 号一定要加括号,否则是函数定义,定义一个返回类型为指针的函数。
2)函数指针没有 ++ 和 – 的运算。