zoukankan      html  css  js  c++  java
  • [转] Linux应用层的定时器Timer

     

      在linux下提供了两种基本的Timer机制:alarm和settimer。
       1、alarm
        #include <unistd.h>
        unsigned int alarm(unsigned int seconds);
        这是个最简单的Timer,当调用了alarm(n)时,等待n秒后,就会触发一次SIGALRM信号,故需要在调用alarm函数前先设置好 SIGALRM信号对应的处理函数才行,而当调用alarm(0)时,表示停止当前的timer处理,不要发出SIGALRM信号。
        返回值:返回上一次调用alarm函数的剩余秒好,若之前没有调用alarm函数,则返回0。
        例(第一次等待1秒触发Timer,之后都是2秒触发):
         #include <iostream>
        #include <unistd.h>
        #include <signal.h>
     
        using namespace std;
     
        void my_alarm_handler(int a){
           cerr<<"my_alarm_handler"<<endl;
           alarm(2);//更改为2秒调用一次Timer
        }
     
        int main(){
           signal( SIGALRM, my_alarm_handler );
           alarm(1);
     
           while(1){}
     
           return 0;
         }
       2、settimer
         #include <sys/time.h>
        #define ITIMER_REAL 0
        #define ITIMER_VIRTUAL 1
        #define ITIMER_PROF 2
     
        int getitimer(int which, struct itimerval *value);
        int setitimer(int which, const struct itimerval *value,struct itimerval *ovalue);
        settimer和gettimer函数都提供了三种类别的Timer供使用:
        1)、ITIMER_REAL:以系统实际的时间来计算,触发时会发出SIGALRM信号。
        2)、ITIMER_VIRTUAL:只计算进程的执行时间(在用户态),触发时会发出SIGVTALRM信号。
        3)、ITIMER_PROF:计算进程在用户态和内核态的处理时间,触发时会发出SIGPROF信号。
        通过第一个参数which来指定要使用哪一种Timer(ITIMER_REAL、ITIMER_VIRTUAL、ITIMER_PROF)。 settimer函数是用来设置对应的Timer的触发时间是多少,而gettimer函数是用来获取上一次Timer设置的时间。设置的时间是一个结构 体struct itimerval:
         struct itimerval {
          struct timeval it_interval; 
          struct timeval it_value; 
        };
        struct timeval {
          long tv_sec; 
          long tv_usec; 
        };
        settimer由第二个参数value设置触发时间,第三个参数ovalue用来获取上一次settimer设置的itimerval值(该参数可以设 置为NULL)。对于itimerval里面变量的值,当我们设置it_interval的值为0时,Timer只会触发一次,而it_value设置为 0时则表示Timer结束。
        返回值:0为成功,-1为失败。
        例(第一次等待1秒触发Timer,之后都是2秒触发):
         #include <iostream>
        #include <sys/time.h>
        #include <signal.h>
     
        using namespace std;
     
        void my_alarm_handler(int a){
          cerr<<"test "<<endl;
        }
     
        int main(){
          struct itimerval t;
          t.it_interval.tv_usec = 0;
          t.it_interval.tv_sec = 2;
          t.it_value.tv_usec = 0;
          t.it_value.tv_sec = 1;
     
          if( setitimer( ITIMER_REAL, &t, NULL) < 0 ){
            cerr<<"settimer error."<<endl;
            return -1;
          }
          signal( SIGALRM, my_alarm_handler );
     
          while(1){
            sleep(2);
          }
          return 0;
        }
        通过上面的例子,我们可以知道对于linux内建Timer只能同一时间处理3个Timer,如果需要多个的话,那么这就是个问题了。不过我们可以通过sleep函数或time函数来结合使用实现定时功能,具体可以参考:http://hi.baidu.com/adrain001/blog/item/60580bc40871d6a18226ace4.html
        参考网址:
     
      (本文转自http://blog.sina.com.cn/s/blog_3e4774e30100puh4.html)
  • 相关阅读:
    《UIP在NIOS上的移植》
    切勿使用:指向局部变量的指针作为函数的返回指针!
    Oeacle创建表空间
    Oracle SQL 语言分类
    线程整理
    输入输出
    异常处理
    哈希算法
    java链表
    课上重点整理
  • 原文地址:https://www.cnblogs.com/wanghetao/p/2270628.html
Copyright © 2011-2022 走看看