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