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

}

        

版权声明:本文为博主原创文章,未经博主允许不得转载。

操作系统内核开发:实现定时器功能

以前在windows的GUI编程中,让我印象最深刻的MFC里面的onTimer回调。也就是你设置一个定时器,当指定的时间过去后,系统会触发你给定的回调函数。Timer功能实在是太重要了,如果没有定时器...
  • tyler_download
  • tyler_download
  • 2016年12月06日 15:50
  • 997

[C-C++]控制台用定时器

Timer在MFC程序中的使用 源代码 Timer在控制台程序中的使用 需要用的函数 源代码 Timer在MFC程序中的使用在MFC中有一个很好用的定时器函数。 使用SetTimer()进行设置定时器...
  • humanking7
  • humanking7
  • 2016年07月16日 20:46
  • 1488

让你提前认识软件开发(21):C程序中的定时器

第1部分 重新认识C语言C程序中的定时器 【文章摘要】        在实际的C程序中,一个模块执行多个操作是很常见的事情。如果多个操作同时进行,会出现程序效率低下、计算机CPU占用率过高等情况,这时...
  • zhouzxi
  • zhouzxi
  • 2014年05月14日 21:50
  • 2533

spring--简单实现定时器(配置+注解)

现在由于开发要求,需要用到计时器的地方可能比较多。在这里把使用spring计时器的基础方法分享出来,希望能给大家带来帮助。 方式一:使用配置方式...
  • huangzhilin2015
  • huangzhilin2015
  • 2015年12月04日 15:41
  • 1335

关于java中定时器的实现 三种方式

定时任务的三种实现方式
  • luojian220
  • luojian220
  • 2016年09月25日 11:17
  • 4457

C++实现简单的定时器

定时器概念: 使用定时器的目的是周期性的执行一个任务,或者是到某一时间去执行某一任务。本章用来处理断开连接超时的客户端,为此,将每个定时时间封装成定时器,并使用链表,时间轮(也是链表),堆等容器类...
  • ythunder
  • ythunder
  • 2016年08月03日 21:36
  • 9702

java定时器实现的三种方式

/**  * 普通thread  * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着,  * 通过sleep方法来达到定时任务的效果。这样可以快速简单的实现,代码如下:  *...
  • u013702312
  • u013702312
  • 2016年04月13日 18:30
  • 2257

深入剖析Linux内核定时器实现机制

【摘要】本文详解了Linux内核的定时器实现机制。具体分析了定时器的分级组织结构,以及在此基础之上的插入、更新、扫描执行等过程。其动态刷新维护的机制值得借鉴。然后介绍了内核定时器相关的API。 【关...
  • tianmo2010
  • tianmo2010
  • 2013年03月22日 16:55
  • 5502

C语言中高效定时器的实现_warmembrace

利用C写过服务器编程的同学想必都熟悉定时器;可能都还研究过。下面就来聊聊定时器的实现; 一般定时器就是在程序处理业务的过程中设置了一个时间 比如5 s 当程序运行5s后这个定时器就要超时,一般超时都有...
  • warmembrace
  • warmembrace
  • 2016年03月06日 10:57
  • 1934

java web 项目中 简单定时器实现 Timer

文章说明:http://blog.csdn.net/sessionsong/article/details/50516320Java web 项目中 简单定时器实现 Timer项目背景: 系统中有一个...
  • xinghuo0007
  • xinghuo0007
  • 2016年12月12日 09:40
  • 806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何在Linux下实现定时器
举报原因:
原因补充:

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