欢迎来到天天文库
浏览记录
ID:25961491
大小:75.18 KB
页数:5页
时间:2018-11-23
《如何在linux下实现定时器》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何在Linux下实现定时器在Linux实现一个定时器,不像Win32下那样直观。在Win32调用SetTimer就行了,在Linux下则没有相应函数可以直接调用。定时器作为一个常用的功能,在Linux当然也有相应实现。下面我们看看几种常用的方法。 要实现定时器功能,最土的办法实现莫过于用sleep/usleep来实现了。当然,它会阻塞当前线程,除了处理定时功能外,什么活也干不了。当然要解决这个问题不难,创建一个单独的线程来负责定时器,其它线程负责正常的任务就行了。 要实现定时器功能,最简单的办法就是ALARM信号。这种方法简单,也相应的缺陷
2、:用信号实现效率较低;最小精度为1秒,无法实现高精度的定义器。简单示例:#include#include staticvoidtimer(intsig){ if(sig==SIGALRM) { printf("timer"); } return;} intmain(intargc,char*argv[]){ signal(SIGALRM,timer); alarm(1); getchar(); return0;} (setitimer和alarm有类
3、似的功能,也是通过信号来实现) 最优雅的方法是使用RTC机制。利用select函数,你可以用单线程实现定时器,同时还可以处理其它任务。简单示例: #include#include#include#include#include#include#include#include intmain(intargc,char*argv[]){ unsignedlongi=0;
4、 unsignedlongdata=0; intretval=0; intfd=open("/dev/rtc",O_RDONLY); if(fd<0) { perror("open"); exit(errno); } /*Setthefreqas4Hz*/ if(ioctl(fd,RTC_IRQP_SET,4)<0) { perror("ioctl(RTC_IRQP_SET)"); close(fd); exit(errno); } /
5、*Setthefreqas4Hz*/ if(ioctl(fd,RTC_IRQP_SET,4)<0) { perror("ioctl(RTC_IRQP_SET)"); close(fd); exit(errno); } /*Enableperiodicinterrupts*/ if(ioctl(fd,RTC_PIE_ON,0)<0) { perror("ioctl(RTC_PIE_ON)"); close(fd); exit(errno); }
6、 for(i=0;i<100;i++) { if(read(fd,&data,sizeof(unsignedlong))<0) { perror("read"); close(fd); exit(errno); } printf("timer"); } /*Disableperiodicinterrupts*/ ioctl(fd,RTC_PIE_OFF,0); close(fd); return0;}
7、**********************************************************************************调用setitimer安装定时器: 它有三个参数第一个设ITIMER_REAL,第二和三个参数是新的时钟间隔和之前设置的时钟间隔。 struct itimerval { struct timeval it_interval; //设为时钟间隔 struct timeval it_value; //设为第一次触发的时钟间隔,其实只被执行一次,以后按照it_i
8、nterval的值 }下面是一个具体的例子#include#include#include#include
此文档下载收益归作者所有