实现定时器,通过itimeval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号,实现定时器
struct itimerval
{
//it_value 表示 定时器的初值,一般是基于这个初值来加或者减
struct timeval it_interval;
//it_interval 表示 程序跑到这里后多久启动定时器
struct timeval it_value;
}
struct timeval
{
__time_t tv_sec;
__suseconds_t tv_usec;
}
//setitime函数原型
int setitimer(__itimer_which_t __which,const struct itimerval* __restirict__new,const struct itimerval* __restrict__old)
setitimer()将value指向结构体设计为计时器的当前值,如果value不是NULL,则返回计时器原值
which的三种状态:
ITIMER_REAL://数值为0,计时器的值实时递减,发送的信号是SIGALRM
ITIMER_VIRTUAL://数值为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM
ITIMER_PROF: //数值为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF
信号处理函数signal(SIGALRM,signal_handler)
测试代码:一秒钟输出一次字符串
1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <stdlib.h>
4 #include <unistd.h>
5 #include <signal.h>
6 static int i=0;
7 void signal_handler(int signal){
8 i++;
9 if(i==2000){
10 printf("luzihao hen shuai!\n");
11 i=0;
12 }
13 }
14
15
16 int main(){
17 struct itimerval itv;
18 //设定定时时间
19 itv.it_interval.tv_sec=0;
20 itv.it_interval.tv_usec=500;
21 //设定开始时间,启动定时器的时间(这里是 1毫秒 就开始计时
23 itv.it_value.tv_sec=1;
24 itv.it_value.tv_usec=0;
25 //设定定时方式(这里是 定时器实时递减)
26 if(-1==setitimer(ITIMER_REAL,&itv,NULL)){
27 perror("setitmer:");
28 exit(-1);
29 }
30 //信号处理函数
31 signal(SIGALRM,signal_handler);
32 while(1);
33
34 return 0;
35 }
~