快速业务通道

如何在Linux下实现定时器

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-05-09

在Linux实现一个定时器,不像Win32下那样直观.在Win32调用SetTimer就行了,在Linux下则没有相应函数可以直接调用.定时器作为一个常用的功能,在Linux当然也有相应实现.下面我们看看几种常用的方法.

要实现定时器功能,最土的办法实现莫过于用sleep/usleep来实现了.当然,它会阻塞当前线程,除了处理定时功能外,什么活也干不了.当然要解决这个问题不难,创建一个单独的线程来负责定时器,其它线程负责正常的任务就行了.

要实现定时器功能,最简单的办法就是ALarm信号.这种方法简单,也相应的缺陷:用信号实现效率较低;最小精度为1秒,无法实现高精度的定义器.简单示例:

#include <stdio.h>
#include <signal.h>
static void timer(int sig) {
if(sig == SIGALRM) {
printf("timern");
}
return;
}

int main(int argc, char* argv[]) {
signal(SIGALRM, timer);
alarm(1);
getchar();
return 0;
}

(setitimer和alarm有类似的功能,也是通过信号来实现)

最优雅的方法是使用RTC机制.利用select函数,你可以用单线程实现定时器,同时还可以处理其它任务.简单示例:

#include <stdio.h>
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>

int main(int argc, char* argv[]) {
unsigned long i = 0;
unsigned long data = 0;
int retval = 0;
int fd = open ("/dev/rtc", O_RDONLY);

if(fd < 0) {
perror("open");
exit(errno);
}

/*Set the freq as 4Hz*/
if(ioctl(fd, RTC_IRQP_SET, 4) < 0) {
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}

/*Set the freq as 4Hz*/

if(ioctl(fd, RTC_IRQP_SET, 4) < 0) {
perror("ioctl(RTC_IRQP_SET)");
close(fd);
exit(errno);
}
拥有帝国一切,皆有可能。欢迎访问phome.net
/* Enable periodic interrupts */
if(ioctl(fd, RTC_PIE_ON, 0) < 0) {
perror("ioctl(RTC_PIE_ON)");
close(fd);
exit(errno);
}

for(i = 0; i < 100; i ) {
if(read(fd, &data, sizeof(unsigned long)) < 0) {
perror("read");
close(fd);
exit(errno);
}
printf("timern");
}

/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);
return 0;
}

拥有帝国一切,皆有可能。欢迎访问phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号