如何在Linux下实现定时器

原创 2006年05月24日 21:05:00

如何在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;

}

 

setitimeralarm有类似的功能,也是通过信号来实现)

 

最优雅的方法是使用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下posix线程实现的定时器

  • 2006年06月15日 00:00
  • 0B
  • 下载

linux下自定义定时器的实现

  • 2017年08月29日 13:36
  • 3KB
  • 下载

linux下如何实现多个定时器

最近在linux下写一个库,是给别人用的,要用到定时器这个功能,而且是多定时器任务的,在windows下实现是很方便的,但是 在linux下就遇到了问题,linux下一个进程只能有一个定时器,如果我用...

linux下的多定时器实现

  • 2010年08月25日 01:05
  • 3KB
  • 下载

Linux下实现定时器Timer的几种方法

定时器Timer应用场景非常广泛,在Linux下,有以下几种方法: 1,使用sleep()和usleep() 其中sleep精度是1秒,usleep精度是1微妙,具体代码就不写了。使用这种方法缺点...
  • lxmky
  • lxmky
  • 2012年06月16日 18:07
  • 38769

Linux下使用setitimer函数实现多个定时器的功能

在一些程序中,我们需要每隔一段时间执行一个函数。例如每2s,5s,10s分别执行不同的函数。如果有多个定时器,实现这个功能就很简单,只需分别定时2s,5s,10s即可。但是Linux中只允许一个进程中...

linux下多定时器的实现(经典)

linux下多定时器的实现 一、已有的定时器接口    时空管理是计算机系统的主要任务。在时间管理中,我们经常利用定时器处理事情:比如tcp协议中利用定时器管理包超时,视频显示中利用定时器来定...
  • houkai6
  • houkai6
  • 2013年01月10日 21:08
  • 438

linux下定时器的实现(select+线程)

更好的计时器类实现:LINUX RTC机制实现计时器类       很多时候需要在LINUX下用到定时器,但像setitimer()和alarm()这样的定时器有时会和sleep()函数发生冲突,这...

Linux下的定时器类实现(select定时+线程)

 更好的计时器类实现:LINUX RTC机制实现计时器类      很多时候需要在LINUX下用到定时器,但像setitimer()和alarm()这样的定时器有时会和sleep()函数发生冲突,...

linux下多定时器的实现(经典)

一、已有的定时器接口    时空管理是计算机系统的主要任务。在时间管理中,我们经常利用定时器处理事情:比如tcp协议中利用定时器管理包超时,视频显示中利用定时器来定时显示视频帧,web服务中利用定时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Linux下实现定时器
举报原因:
原因补充:

(最多只允许输入30个字)