• linux下定时器的实现


    简介:

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

    原理剖析:

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

    代码:

      

     1 /*
     2  * =====================================================================================
     3  *
     4  *       Filename:  7.c
     5  *
     6  *    Description:  
     7  *
     8  *        Version:  1.0
     9  *        Created:  2015年05月21日 16时42分48秒
    10  *       Revision:  none
    11  *       Compiler:  gcc
    12  *
    13  *         Author:  3me (), 
    14  *   Organization:  
    15  *
    16  * =====================================================================================
    17  */
    18 #include <stdlib.h>
    19 
    20 #include <sys/time.h>
    21 #include <signal.h>
    22 #include <time.h> 
    23 #include <stdio.h>
    24 #include <unistd.h>
    25 
    26 #define UPDATE_TIME 3
    27 #define INTERVAL_TIME 24
    28 
    29 
    30 void my_alarm_handler(int a){
    31         printf("signal trigger.
    ");
    32 }
    33 
    34 
    35 int main(){
    36 
    37         long tv;
    38         time_t timep; 
    39         struct tm *p; 
    40         time(&timep); 
    41         p=localtime(&timep); 
    42 
    43         printf("%d:%d:%d
    ",  p->tm_hour, p->tm_min, p->tm_sec); 
    44 
    45         if ( p->tm_hour < UPDATE_TIME )
    46         {
    47                 tv = ((UPDATE_TIME - p->tm_hour - 1)* 60 + p->tm_min) * 60;
    48         }
    49         else 
    50         {
    51                 tv = ( (24 + UPDATE_TIME - p->tm_hour - 1) * 60 + p->tm_min) * 60;
    52 
    53         }
    54 
    55         struct itimerval t;
    56         t.it_interval.tv_usec = 0;
    57         t.it_interval.tv_sec = INTERVAL_TIME*60*60;
    58         t.it_value.tv_usec = 0;
    59         t.it_value.tv_sec = tv;
    60 
    61         if( setitimer( ITIMER_REAL, &t, NULL) < 0 ){
    62                 perror("settime error.");
    63                 return -1;
    64         }
    65         signal( SIGALRM, my_alarm_handler );
    66 
    67         while(1){
    68 
    69                 sleep(2);
    70 
    71         }
    72 
    73         return EXIT_SUCCESS;
    74 }
  • 相关阅读:
    优酷kux转mp4
    C++实现将一个文件夹内容拷贝至另一个文件夹
    获取NX一组属性
    获取NX特征名称(无时间戳)
    利用glog打印日志
    C++获取运行程序当前目录
    获取NX装配结构信息
    解析形如(k,v)(k,v)(k,v)字符串
    多NX如何共存
    C++ (C#)实现获取NX PART预览图
  • 原文地址:https://www.cnblogs.com/3me-linux/p/4535318.html
Copyright © 2020-2023  润新知