如何在Linux下实现定时器
在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("timer/n");
}
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);
}
/* 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("timer/n");
}
/* Disable periodic interrupts */
ioctl(fd, RTC_PIE_OFF, 0);
close(fd);
return 0;
}
分享到:
相关推荐
如何在Linux下实现定时器 如何在Linux下实现定时器 如何在Linux下实现定时器 如何在Linux下实现定时器 如何在Linux下实现定时器
//linux只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理 // //这个实现允许用户使用多个自定义的定时器,每个自定义的定时器将周期地被触发直到其被删除。实现的主要思路...
linux线程实现定时器源码
linux 下使用红黑树实现的多线程定时器, 定时回调对应的回调函数,定时单位为毫秒。
Linux下实时定时器的实现及应用.PDF
在Linux实现一个定时器,不像Win32下那样直观。在Win32调用SetTimer就行了,在Linux下则没有相应函数可以直接调用。定时器作为一个常用的功能,在Linux当然也有相应实现。本文介绍几种常用的方法。
linux下实现应用层的定时器的创建,开启,支持调用系统消息开启定时器
比较详细的linux下定时器的实现和应用文档
可实现Linux下毫秒级的软件定时,但依赖于系统HZ数,如 HZ=100,最小定时为10ms HZ=1000,最小定时才是1ms 理论上可以实现若干个定时器,依赖于系统性能 设计了两种定时方式 STIMER_CYCLE:循环周期定时;STIMER_ONCE:单次...
详细描述了Linux下的定时器的原理,实现
Linux下实时定时器的实现及应用.pdf
主要是对linux内核中的定时器的使用编写的一个例子,代码中包括timer.c和makefile文件,还有一些已经编译的文件,其中有个timer.ko文件就是内核模块文件,在终端使用 insmod timer.ko就可以插入到linux内核(要与...
嵌入式Linux下高精度定时器的实现,范异君,,嵌入式Linux开发过程中经常遇到需要设定大量定时器的情况,随着嵌入式技术的发展,嵌入式Linux应用场合也越来越广,在定时的精度以��
一种新的嵌入式Linux高性能定时器实现方法.pdf
文件列表:timer.h,timer.c 功能:实现了linux下的多定时器,采用双向链表来维护定时器列表,用户可利用其中的接口来创建定时器,并注册超时回调函数。时钟计时采用select系统调用来实现。
本文提出一种linux用户空间下的一种高性能定时器池的实现方法,实现主要基于时间轮和红黑树,以及linux内核提供了一种利于管理的定时器句柄timerfd。结合红黑树、位图、时间轮等技术,设计一种高性能级定时器池,池...
Linux应用层的简单易用的定时器,用posix线程库实现。
linux下的C语言开发(定时器) 定时器是我们需要经常处理的一种资源。那linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号。这里的定时器就相当于系统每隔一段时间给...
以最小堆、红黑树、时间轮三种方式实现定时器,时间轮效率最高,非常具有参考价值!
一种基于条件变量的超时机制实现的较高精度又简单的定时器,经过实际测试验证可行。之所以利用条件变量的超时机制,是为了满足可以随时打断及时的需求,同时又不需要轮询的去查,在等待的过程中,线程处于阻塞休眠...