简介:

  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;
}

linux下定时器的实现的更多相关文章

  1. Linux下定时器

    http://unix8.net/linux%E4%B8%8B%E5%AE%9A%E6%97%B6%E5%99%A8.html 一. 基础知识 1.时间类型.Linux下常用的时间类型有4个:time ...

  2. linux下定时器介绍1

    POSIX Timer 间隔定时器 setitimer 有一些重要的缺点,POSIX Timer 对 setitimer 进行了增强,克服了 setitimer 的诸多问题: 首先,一个进程同一时刻只 ...

  3. linux下定时器介绍2--timer_create等函数集的使用示例

    程序1:采用新线程派驻的通知方式 程序2:通知方式为信号的处理方式 #include <stdio.h>#include <time.h>#include <stdlib ...

  4. Linux下的微秒级定时器: usleep, nanosleep, select, pselect

    Linux下的微秒级定时器: usleep, nanosleep, select, pselect 标签: linuxnulldelaystructdate 2012-02-07 23:29 4979 ...

  5. Linux下的定时器:alarm()与setitimer()

    Linux下的定时器有两种,以下分别介绍: 1.alarm 如果不要求很精确的话,用alarm()和signal()就够了 unsigned int alarm(unsigned int second ...

  6. Linux下的定时器

    以下摘自linux下的man文件:(man  getitimer) #include  <sys/time.h> int  getitimer(int which,  struct iti ...

  7. Linux下的定时器类实现(select定时+线程)

    更好的计时器类实现:LINUX RTC机制实现计时器类(原创) 很多时候需要在LINUX下用到定时器,但像setitimer()和alarm()这样的定时器有时会和sleep()函数发生冲突,这样就给 ...

  8. Linux下一种高效多定时器实现

    Linux下一种高效多定时器实现 作者:LouisozZ 日期:2018.08.29 运行环境说明 由于在 Linux 系统下一个进程只能设置一个时钟定时器,所以当应用需要有多个定时器来共同管理程序运 ...

  9. 在Linux下的中断方式读取按键驱动程序

    // 在Linux下的中断方式读取按键驱动程序 //包含外部中断 休眠 加入poll机制 // 采用异步通知的方式 // 驱动程序发 ---> app接收 (通过kill_fasync()发送) ...

随机推荐

  1. jvm——NIO

    https://blog.csdn.net/Evankaka/article/details/48464013 https://www.cnblogs.com/aspirant/p/9166944.h ...

  2. 这里面ID为002和005的记录是重复的,在这里要把其中一条去掉,达到下面的效果:

    --去掉重复的记录 select ID,Code,ColorNum from (     SELECT      ROW_NUMBER() OVER(         PARTITION BY Cod ...

  3. linux 系统下 tar 的压缩与解压缩命令

    1.压缩 [small@sun shine]# tar -zcvf java.tar.gz java java/ java/default/ java/default/THIRDPARTYLICENS ...

  4. selenium,控制滚动条

    今天写selenium用例的时候,遇见奇葩的问题,FF下是没有错误的,但是在chrome和ie下就会有问题,后来发现是 操作中点击一个按钮,在页面不可见,就会导致异常,解决方法如下: element ...

  5. windows与ubuntu双系统的安装

    将ubuntu镜像烧录至U盘,从U盘启动电脑 选择自定义安装,不要选择它本身的双系统选项. 我的方案分区: 1. 挂载点/:主分区:安装系统和软件:大小为30G:分区格式为ext4:2. 挂载点/ho ...

  6. http三次握手,四次挥手

    本文经过借鉴书籍资料.他人博客总结出的知识点,欢迎提问 序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生:给字节编上序号后 ...

  7. docker 容器不能联网

    Unknown Endpoint: Inaccessible host: `dynamodb.us-east-1.amazonaws.com' 别慌!Docker容器内不能联网的6种解决方案 注:下面 ...

  8. Spring Data JPA学习笔记

    下面先来介绍一下JPA中一些常用的查询操作: //And --- 等价于 SQL 中的 and 关键字,比如 findByHeightAndSex(int height,char sex): publ ...

  9. @清晰掉 C++ 中的 enum 结构在内存中是怎么存储的?

     C++ 中的 enum 结构在内存中是怎么存储的? C++ C++ 中的 enum 结构在内存中是怎么存储的?里面存储的是常量值吗?   关于占用内存的大小,enum类型本身是不占内存的,编译器直接 ...

  10. jQuery easyui datagrid 的数据加载

        其实easyuidatagrid加载数据只有两种方式:一种是ajax加载目标url返回的json数据:另一种是加载js对象,也就是使用loadDate方法,这种方法用于加载本地js数据(非ur ...