简介:

  linux下经常有这样的需求,需要定时轮询执行某种任务,当然,用shell脚本的话,crontab和at就可以满足要求。如果从C语言的角度来看,实现定时器也是一个比较简单的任务,因为具有普遍性,做此记录,备忘。

原理剖析:

  定时器的主要任务是定时和轮询,如果对libc的api熟悉的话,很容易想到settitimer函数,这不是一个现成的定时器么,coder需要做的,仅仅是把设定时间和当前时间的差值计算代入即可。

代码:

  

 /*
* =====================================================================================
*
* Filename: 7.c
*
* Description:
*
* Version: 1.0
* Created: 2015年05月21日 16时42分48秒
* Revision: none
* Compiler: gcc
*
* Author: 3me (),
* Organization:
*
* =====================================================================================
*/
#include <stdlib.h> #include <sys/time.h>
#include <signal.h>
#include <time.h>
#include <stdio.h>
#include <unistd.h> #define UPDATE_TIME 3
#define INTERVAL_TIME 24 void my_alarm_handler(int a){
printf("signal trigger.\n");
} int main(){ long tv;
time_t timep;
struct tm *p;
time(&timep);
p=localtime(&timep); printf("%d:%d:%d\n", p->tm_hour, p->tm_min, p->tm_sec); if ( p->tm_hour < UPDATE_TIME )
{
tv = ((UPDATE_TIME - p->tm_hour - )* + p->tm_min) * ;
}
else
{
tv = ( ( + UPDATE_TIME - p->tm_hour - ) * + p->tm_min) * ; } struct itimerval t;
t.it_interval.tv_usec = ;
t.it_interval.tv_sec = INTERVAL_TIME**;
t.it_value.tv_usec = ;
t.it_value.tv_sec = tv; if( setitimer( ITIMER_REAL, &t, NULL) < ){
perror("settime error.");
return -;
}
signal( SIGALRM, my_alarm_handler ); while(){ sleep(); } return EXIT_SUCCESS;
}

最新文章

  1. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
  2. 应用程序框架实战十八:DDD分层架构之聚合
  3. Hello World!
  4. Spring AOP不拦截从对象内部调用的方法原因
  5. 透过现象看现象(SQL501N错误处理)
  6. 作业:用HTML制作简历
  7. Java创建WebService服务及客户端实现
  8. WSDL相关文档
  9. hdoj 2141 Can you find it?【二分查找+暴力】
  10. 常用Json
  11. 《5》CentOS7.0+OpenStack+kvm云平台的部署—组态Horizon
  12. mysql 安装-zip版
  13. 解决CentOS7安装Tomcat不能被外部访问的问题
  14. ab 站点压力测试工具
  15. vue间通信
  16. 查看加密的vba代码
  17. robot framework + python实现http接口自动化测试框架
  18. SpringMVC+SPring+Maven+Mybaits+Shiro+Mybaits基础开发项目
  19. CANopen和DeviceNet有何异同
  20. mongdb ---shard

热门文章

  1. 【leetcode】Max Area of Island
  2. Linux系统下lz4解压缩命令小结
  3. luogu P1314 聪明的质监员 x
  4. 基于OpenCV/TensorFlow的手写MNIST文字匹配
  5. java开发需掌握技能2
  6. BZOJ 1859 Luogu P2589 [ZJOI2006]碗的叠放 (计算几何)
  7. Spring Boot教程(十三)整合elk(2)
  8. java统计文档中相同字符出现次数(超详细)
  9. event.currentTarget
  10. tcpdump指定IP和端口抓包