900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > [转] Linux应用层的定时器Timer

[转] Linux应用层的定时器Timer

时间:2022-03-15 04:03:41

相关推荐

[转] 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函数来结合使用实现定时功能,具体可以参考:/adrain001/blog/item/60580bc40871d6a18226ace4.html 参考网址: /p/androidteam/wiki/TimerExample /adrain001/blog/item/6d488b63ff13fe680c33fae6.html //05/linux_timer.html /s/blog_66a6a5ec0100koc0.html /susdisk/blog/item/03f70d35e8e2e182a61e1288.html (本文转自/s/blog_3e4774e30100puh4.html)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。