Welcome 微信登录

首页 / 操作系统 / Linux / Linux 定时器编程

一、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)        {        }}