[Linux Signal] Linux计时器之间隔计时器例子说明 - 刘傲天

in 默认分类 with 0 comment

间隔计时器

间隔计时器的应用场景,比如现实中医生告诉你一个小时后服用这个药,之后每三个小时服用一次这个药,像这种场景你就可以应用到间隔计时器,我们今天就来写一个间隔计时器的例子。

相关结构体

struct itimerval {
    struct timeval it_interval; /* next value */
    struct timeval it_value;    /* current value */
};

struct timeval {
    time_t      tv_sec;         /* seconds */
    suseconds_t tv_usec;        /* microseconds */
};

这是从官网复制过来的,现在使用中文解读一下内容,itimerval结构体内包含了两个timeval结构体,这个timeval结构体是用来表示时间的,至于为什么是结构体是因为它的时间更为细节,里边包含了tv_sec秒和tv_usec微妙,而itimerval结构体里边的两个内容第一个it_interval是间隔值对应到我们的例子当中就是一个小时后服用一次药的这个一个小时,而it_value则是每三个小时服用一次的这个间隔也就是三个小时这个数额。

应用

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

void eat(int signum);

int main(int argc, char *argv[])
{
  const int init = 1; // 一个小时
  const int current = 3; // 间隔的三个小时

  struct itimerval new_timerval;
  signal(SIGALRM, eat);

  // 间隔时间
  new_timerval.it_interval.tv_sec = current;
  new_timerval.it_interval.tv_usec = 0;

  // 下一个时间,也就是1小时
  new_timerval.it_value.tv_sec = init;
  new_timerval.it_value.tv_usec = 0;

  setitimer(ITIMER_REAL, &new_timerval, NULL);

  while (1){
    pause();
  }



  return 0;
}

void eat(int signum){
  static int num = 5; // 一共六片药
  printf("正在吃第%d片药\n", num--);
  fflush(stdout);

  if (num < 1){
    printf("%s\n", "吃完了!");
    exit(0);
  }
}

编译

$:g++ chiyao.cc
$:./a.out

执行结果

// 这里休眠了1秒
正在吃第5片药
// 这里休眠了3秒
正在吃第4片药
// 这里休眠了3秒
正在吃第3片药
// 这里休眠了3秒
正在吃第2片药
// 这里休眠了3秒
正在吃第1片药
吃完了!

请忽略以上//后边的内容,还有一个就是我们在代码中用1秒代替了我们上边例子中的小时,也就是说我们用秒的单位代替了上边的以小时为单位。

Responses