[linux] 通过 /dev/rtc 实现 timer 机制
2008-07-26 15:29:24| 分类:
unix
| 标签:
|举报
|字号大中小 订阅
*nix 下 timer机制 标准实现,一般是用 sigalarm + setitimer() 来实现的,但这样就与 select/epoll 等逻辑有所冲突,我希望所有 event 的通知逻辑都从 select/epoll 中触发。(FreeBSD 中 kqueue 默认就有 FILTER_TIMER,多好)
ps. /dev/rtc 只能被 open() 一次,因此上面希望与 epoll 合并的想法基本不可能了~
下面是通过 /dev/rtc (real-time clock) 硬件时钟实现的 timer机制。:-)
其中 ioctl(fd, RTC_IRQP_SET, 4) 的第三个参数只能是 2, 4, 8, 16, 32 之一,表示 xx Hz。
-------------------------------------------------
#include <linux/rtc.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <sys/types.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <time.h>
#include <err.h>
int main(void)
{
unsigned long i = 0;
unsigned long data = 0;
int fd = open("/dev/rtc", O_RDONLY);
if ( fd < 0 )
errx(1, "open() fail");
/* set the freq as 4Hz */
if ( ioctl(fd, RTC_IRQP_SET, 4) < 0 )
errx(1, "ioctl(RTC_IRQP_SET) fail");
/* enable periodic interrupts */
if ( ioctl(fd, RTC_PIE_ON, 0) < 0 )
errx(1, "ioctl(RTC_PIE_ON)");
for ( i = 0; i < 100; i++ )
{
if ( read(fd, &data, sizeof(data)) < 0 )
errx(1, "read() error");
printf("timer %d\n", time(NULL));
}
/* enable periodic interrupts */
if ( ioctl(fd, RTC_PIE_OFF, 0) < 0 )
errx(1, "ioctl(RTC_PIE_OFF)");
close(fd);
return 0;
}
评论这张
转发至微博
转发至微博
评论