一、Linux应用程序定时器用到的数据结构为: struct itimerval { struct timeval it_interval; /* next value */ struct timeval it_value; /* current value */ };其中it_value用于设置第一次定时器到达并发送信号的时间,it_interval用于设置定时器终止后的重设值.若为0则定时器在终止后将失效;若不为0,则定时器终止后,将会以该值进行重新定时。 struct timeval { long tv_sec; /* seconds */ long tv_usec; /* microseconds */ };int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);设置定时器间隔,其中第一个变量which的取值如下:ITIMER_REAL :以系统真实的时间来计算,它送出SIGALRM信号。ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。ITIMER_PROF :以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信 号。#include <signal.h>typedef void (*sighandler_t)(int);sighandler_t signal(int signum, sighandler_t handler);该函数用于设置某一信号的对应处理函数,对定时器来说信号有:SIGALRM、SIGVTALRM、SIGPROF; handler用于设置某一信号到来时的处理函数。所在头文件signal.h下面是示例程序#include <stdio.h>#include <string.h>#include <signal.h>#include <unistd.h>#include <sys/time.h>/*设置定时器到达时间*/#define REFRESH_TIME 10/*设置定时器*/void set_refresh_time(int sec){ struct itimerval nvalue; nvalue.it_value.tv_sec = sec; nvalue.it_value.tv_usec = 0; nvalue.it_interval.tv_sec = sec;//每隔sec时间触发一次定时器 nvalue.it_interval.tv_usec = 0;/*此处使用的是ITIMER_REAL,所以对应的是SIGALRM信号*/ setitimer(ITIMER_REAL, &nvalue, NULL);}/*定时器处理函数*/void timer_handler(int msg){ switch(msg) { case SIGALRM: printf("to do someting when set timer is comming
"); break; default: break; } return ;}int main(int argc, char **argv){int value;/*设置SIGALRM信号的处理函数,即定时器处理函数*/ signal(SIGALRM, timer_handler);if(!argv[1]){Printf("use default time %d
", REFRESH_TIME);/*设置定时器*/ set_refresh_time(REFRESH_TIME);}else{value = atoi(argv[1]);set_refresh_time(value);} while(1) { }}