设为首页 加入收藏

TOP

Linux 定时器编程
2014-11-24 11:10:53 来源: 作者: 【 】 浏览:0
Tags:Linux 定时器 编程

一、Linux应用程序定时器


用到的数据结构为:


struct itimerval {


struct timeva l it_interval; /* next value */


struct timeva l it_value; /* current value */


};


其中it_value用于设置第一次定时器到达并发送信号的时间,it_interval用于设置定时器终止后的重设值.若为0则定时器在终止后将失效;若不为0,则定时器终止后,将会以该值进行重新定时。


struct timeva l {


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


typedef void (*sighandler_t)(int);


sighandler_t signal(int signum, sighandler_t handler);


该函数用于设置某一信号的对应处理函数,对定时器来说信号有:SIGALRM、SIGVTALRM、SIGPROF; handler用于设置某一信号到来时的处理函数。所在头文件signal.h




下面是示例程序


#include


#include


#include


#include


#include


/*设置定时器到达时间*/


#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\n");


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\n", REFRESH_TIME);


/*设置定时器*/


set_refresh_time(REFRESH_TIME);


}


else


{


value = atoi(argv[1]);


set_refresh_time(value);


}


while(1)


{


}


}


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Linux内核加载过程 下一篇Linux 内核定时器的使用

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·【C语言】动态内存管 (2025-12-27 06:23:20)
·C语言中的内存管理 - (2025-12-27 06:23:16)
·C语言指南:C语言内 (2025-12-27 06:23:14)
·Redis on AWS:Elast (2025-12-27 04:19:30)
·在 Spring Boot 项目 (2025-12-27 04:19:27)