`

Linux下的定时器

阅读更多
Linux下的定时器有两种,以下分别介绍:
       1、alarm
       如果不要求很精确的话,用 alarm() 和 signal() 就够了
           unsigned int alarm(unsigned int seconds)
       专门为SIGALRM信号而设,在指定的时间seconds秒后,将向进程本身发送SIGALRM信号,又称为闹钟时间。进程调用alarm后,任何以前的alarm()调用都将无效。如果参数seconds为零,那么进程内将不再包含任何闹钟时间。如果调用alarm()前,进程中已经设置了闹钟时间,则返回上一个闹钟时间的剩余时间,否则返回0。
       示例:
       #include <stdio.h>
       #include <unistd.h>
       #include <signal.h>
       void sigalrm_fn(int sig)
       {
               /* Do something */
               printf("alarm!\n");
               alarm(2);
               return;
       }
       int main(void)
       {
               signal(SIGALRM, sigalrm_fn);
               alarm(2);
               /* Do someting */
               while(1) pause();
       }

       2、setitimer
       int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue));
       setitimer()比alarm功能强大,支持3种类型的定时器:
       ITIMER_REAL :  以系统真实的时间来计算,它送出SIGALRM信号。  
       ITIMER_VIRTUAL :  以该行程真正有执行的时间来计算,它送出SIGVTALRM信号。  
       ITIMER_PROF :  以行程真正有执行及在核心中所费的时间来计算,它送出SIGPROF信号。  
       Setitimer()第一个参数which指定定时器类型(上面三种之一);第二个参数是结构itimerval的一个实例;第三个参数可不做处理。
       Setitimer()调用成功返回0,否则返回-1。
       下面是关于setitimer调用的一个简单示范,在该例子中,每隔一秒发出一个SIGALRM,每隔0.5秒发出一个SIGVTALRM信号::
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <signal.h>
       #include <time.h>
       #include <sys/time.h>
       int sec;
       void sigroutine(int signo){
           switch (signo){
           case SIGALRM:
               printf("Catch a signal -- SIGALRM \n");
               signal(SIGALRM, sigroutine);
               break;
           case SIGVTALRM:
               printf("Catch a signal -- SIGVTALRM \n");
               signal(SIGVTALRM, sigroutine);
               break;
           }
           return;
       }
       int main()
       {
           struct itimerval value, ovalue, value2;
   
           sec = 5;
           printf("process id is %d ", getpid());
           signal(SIGALRM, sigroutine);
           signal(SIGVTALRM, sigroutine);
           value.it_value.tv_sec = 1;
           value.it_value.tv_usec = 0;
           value.it_interval.tv_sec = 1;
           value.it_interval.tv_usec = 0;
           setitimer(ITIMER_REAL, &value, &ovalue);
           value2.it_value.tv_sec = 0;
           value2.it_value.tv_usec = 500000;
           value2.it_interval.tv_sec = 0;
           value2.it_interval.tv_usec = 500000;
           setitimer(ITIMER_VIRTUAL, &value2, &ovalue);
           for(;;)
               ;
       }

        该例子的屏幕拷贝如下:
        localhost:~$ ./timer_test
        process id is 579
        Catch a signal – SIGVTALRM
        Catch a signal – SIGALRM
        Catch a signal – SIGVTALRM
        Catch a signal – SIGVTALRM
        Catch a signal – SIGALRM
        Catch a signal –GVTALRM

       注意:Linux信号机制基本上是从Unix系统中继承过来的。早期Unix系统中的信号机制比较简单和原始,后来在实践中暴露出一些问题,因此,把那些建立在早期机制上的信号叫做"不可靠信号",信号值小于SIGRTMIN(Red hat 7.2中,SIGRTMIN=32,SIGRTMAX=63)的信号都是不可靠信号。这就是"不可靠信号"的来源。它的主要问题是:进程每次处理信号后,就将对信号的响应设置为默认动作。在某些情况下,将导致对信号的错误处理;因此,用户如果不希望这样的操作,那么就要在信号处理函数结尾再一次调用signal(),重新安装该信号。
分享到:
评论

相关推荐

    linux下定时器源码.zip

    1. **Linux定时器基础** Linux内核中的定时器系统主要分为两种:软定时器(software timers)和硬件定时器(hardware timers)。软定时器基于软件调度,而硬件定时器则依赖于硬件中断来触发。 2. **软定时器...

    基于mini2440的定时器应用,包含linux下定时器的基本驱动及应用程序.rar

    在这个基于Mini2440开发板的项目中,我们关注的是Linux下的定时器实现,尤其是如何在C语言环境下编写基本的驱动程序和应用程序。Mini2440是一款流行的S3C2440 ARM9开发板,常用于嵌入式系统的学习与开发。 首先,...

    linux下定时器实现

    综上所述,理解并熟练掌握Linux下的定时器实现方式对于系统级编程和后台服务的开发至关重要。无论是最小堆、红黑树还是时间轮,都有其独特的应用场景和优缺点。在设计和实现定时器时,应根据任务的具体需求,如...

    linux下多定时器+线程池的实现(经典)

    //linux只允许单进程拥有一个定时器,因此在linux下的单进程中要使用多个定时器,则需要自己维护管理 // //这个实现允许用户使用多个自定义的定时器,每个自定义的定时器将周期地被触发直到其被删除。实现的主要思路...

    实用的Linux c 定时器代码

    总的来说,CTimer类封装了Linux下的定时器功能,提供了一种方便的方式来在C++项目中实现定时任务,降低了开发者的编程负担,并提高了代码的可复用性。通过理解和使用CTimer,开发者可以更好地掌握Linux系统编程中的...

    Linux下C语言 定时器

    本节我们将深入探讨Linux环境下如何使用C语言创建基于红黑树(Red-Black Tree)的多线程定时器,以及如何设置定时回调函数,其定时单位精确到毫秒。 首先,我们需要了解什么是定时器。定时器是一种机制,它可以在...

    linux多定时器多线程

    二、Linux定时器 1. **定时器类型**:Linux提供了两种主要的定时器类型:POSIX定时器(`timer_create()`、`timer_settime()`等)和系统调用`alarm()`、`sleep()`。前者更灵活,支持相对和绝对时间,后者简单但功能...

    linux 内核定时器的使用

    主要是对linux内核中的定时器的使用编写的一个例子,代码中包括timer.c和makefile文件,还有一些已经编译的文件,其中有个timer.ko文件就是内核模块文件,在终端使用 insmod timer.ko就可以插入到linux内核(要与...

    基于linux的定时器实验

    基于linux嵌入式系统的定时器开发实验

    linux内核定时器

    在Linux操作系统中,内核定时器是系统时间管理的核心组件之一,它允许内核执行特定的任务或函数在预设的时间间隔之后。这个程序展示了如何在Linux内核中创建和使用一个基本的定时器,实现每10秒打印一条消息的功能。...

    Linux内核定时器的实例

    - 软中断:在某些情况下,定时器的回调可能需要在软中断上下文执行,这意味着它们不能睡眠,但可以快速完成工作。 - 定时器链表:内核维护了一个全局的定时器链表,所有活动的定时器都按到期时间排序在这个链表上,...

    Linux下实时定时器的实现及应用

    根据给定的文件信息,以下是对“Linux下实时定时器的实现及应用”的详细解析,主要涵盖定时器的实现背景、内核中的时钟管理、延时机制、实时时钟的具体实现及其应用。 ### 实时定时器的实现背景 在嵌入式系统开发...

    Linux中定时器的算法实现

    详细描述了Linux下的定时器的原理,实现

    linux下软件定时器的实现

    可实现Linux下毫秒级的软件定时,但依赖于系统HZ数,如 HZ=100,最小定时为10ms HZ=1000,最小定时才是1ms 理论上可以实现若干个定时器,依赖于系统性能 设计了两种定时方式 STIMER_CYCLE:循环周期定时;STIMER_ONCE:单次...

    linux 内核定时器 编程

    在Linux系统中,内核定时器是用于在特定时间间隔执行特定操作的重要机制。它们是内核编程中的关键组件,特别是在需要延时或周期性任务的场合。本篇将深入探讨Linux内核定时器的编程,包括如何创建、管理以及它们的...

    WIN和LINUX毫秒定时器

    ### WIN和LINUX毫秒定时器 在计算机编程领域中,定时器是极其重要的组成部分之一,尤其是在需要执行周期性任务或需要控制程序运行间隔的情况下。本文将深入探讨Windows和Linux平台上的毫秒级定时器,并提供相关的...

    第9章linux信号与定时器

    通过编写一个程序来注册三个定时器,分别对实际时间、进程使用CPU时间、用户使用CPU时间进行计时,可以深入理解信号与定时器在Linux环境下的应用。这种练习有助于开发者掌握如何在实际项目中使用这些机制,提高程序...

    linux内核定时器模板

    首先,我们了解下Linux内核定时器的基本概念。Linux内核中的定时器基于硬件定时器,如pit(Programmable Interval Timer)或HPET(High Precision Event Timer)。这些硬件定时器会产生中断,从而触发内核的定时器子...

    基于Linux定时器管理器

    本文将深入探讨“基于Linux定时器管理器”的相关知识点,包括定时器的类型、工作原理以及如何添加、删除定时器,并对`end_timer_1`这个文件可能涉及的内容进行分析。 首先,让我们了解Linux中的定时器类型。主要有...

    Linux下posix线程实现的定时器

    本篇文章将深入探讨如何在Linux环境下利用pthread库创建和管理定时器,以及它在实际应用中的作用。 POSIX线程库中的定时器主要由`pthread_cond_t`条件变量和`pthread_mutex_t`互斥锁配合使用,实现定时触发回调函数...

Global site tag (gtag.js) - Google Analytics