Linux定时器

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux定时器相关的知识,希望对你有一定的参考价值。

目录

分析:实现定时器,通过itimerval结构体以及函数setitimer产生的信号,系统随之使用signal信号处理函数来处理产生的定时信号,从而实现定时器。

itimerval结构体

先看itimerval的结构体

struct itimerval

       /* Value to put into `it_value' when the timer expires. */
       //计时器的初始值,一般基于这个初始值来加或者来减,看控制函数的参数配置
       struct timeval it_interval;
       /* Time to the next timer expiration. */
       //程序跑到这之后,多久启动定时器
       struct timeval it_value;
;

struct timeval

       __time_t tv_sec; /* Seconds. */
       __suseconds_t tv_usec; /* Microseconds. */
;

setitimer()设置定时方式

setitimer()将value指向的结构体设为计时器的当前值,如果第三个参数oldvalue不是NULL(一般都设为NULL),将返回计时器原有值。

int setitimer (__itimer_which_t __which,
               const struct itimerval *__restrict __new,
               struct itimerval *__restrict __old)

which:三种类型

  • ITIMER_REAL //内核宏定义为0,计时器的值实时递减,减完则发送信号SIGALRM(常用)。
  • ITIMER_VIRTUAL //内核宏定义为1,进程执行时递减计时器的值,发送的信号是SIGVTALRM(了解)。
  • ITIMER_PROF //内核宏定义为2,进程和系统执行时都递减计时器的值,发送的信号是SIGPROF(了解)。

signal()信号处理

这边需要捕获对应的信号并进行逻辑处理 ,这个就像单片机的中断处理函数。

signal(SIGALRM,signal_handler);

返回说明:
成功执行时,返回0。失败返回-1

实现代码

/*该代码实现的功能是: 1s后开启定时器,然后每隔1s向终端打印hello*/
#include <stdio.h>
#include <sys/time.h>
#include <stdlib.h>
#include <signal.h>
static int i;

void signal_handler(int signum)

      i++;
      if(i == 2000)//0.5ms溢出一次,一共溢出了2000次,就是1s
          printf("hello\\n");
          i = 0;
      


int main()

      struct itimerval itv;
      //1、设定定时时间:0.5ms
      itv.it_interval.tv_sec = 0;
      itv.it_interval.tv_usec = 500;
      //2、多久启动定时器:1s后启动
      itv.it_value.tv_sec = 1;
      itv.it_value.tv_usec = 0;
      //3、设定定时方式
      if( -1 == setitimer(ITIMER_REAL, &itv, NULL))
            perror("error");
            exit(-1);
      
      //4、信号处理
      signal(SIGALRM,signal_handler);
      while(1);
      return 0;

以上是关于Linux定时器的主要内容,如果未能解决你的问题,请参考以下文章

019_linux驱动之_定时器的引入

定时寄存器方式二的初始值多少

定时器与时间管理

Linux x86_64内核中断初始化

定时器缓动动画

Linux内核定时器