Linux定时器1

目录

1.itimerval-定时器的基本时间单元

2.setitimer——创建定时器

3.简单实例


1.itimerval-定时器的基本时间单元

首先要理解itimerval结构体,这是组成定时器的基本时间单元。关于timeval结构体,上一篇博客有讲到,是由秒时间和微秒时间组成的。这里it_interval表示的是一个timeval类型的时间,这个时间是创建的定时器的周期性。即如果这一时间设置为5s,则该定时器每5s触发一次。Itvalue也是timeval类型的时间,表示首次倒计时时距离定时器触发的时间。

struct itimerval{
  struct timeval it_interval; // 时间间隔,是0则定时器只触发一次,否则周期性触发
  struct timeval itvalue; // 当前距离定时器到期的时间
}

2.setitimer——创建定时器

int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
// which的值为ITIMER_REAL, ITIMER_VIRTUAL,ITIMER_PROF

通过setitimer就可以创建一个定时器了,这个函数有三个参数。第一个参数可以用三个确定好的值进行赋值,分别是:

ITIMER_REAL,表示定时器是以真实的时间计时的,到期时会产生SIGALARM信号。

ITIMER_VIRTUAL,表示定时器以进程虚拟时间计时(用户模式下CPU时间),到期时会产生SIGVTALRM信号。

ITIMER_PROF,以进程时间(用户与内核CPU时间总和)计时,到期会产生SIGPROF信号。

我们通常会使用ITIMER_REAL,即真实时间计时,并创建SIGALARM信号对应的信号处理函数。

第二个参数是定时器类型itimerval的变量,表示的含义如上所述。通过new_value来定义定时器是否具有周期性以及开始时距离定时器触发的时间。

第三个参数类型和第二个参数一致,返回定时器的前一设置。通常设为NULL或0。

3.简单实例

#include
#include 
#include 
#include 
using namespace std;

static void sigalrmHandler(int sig)
{
  cout << "alarm has been triggered" << endl;
}

int main()
{
  struct itimerval itv; // 声明一个定时器时间设置
  // 设置定时器参数.表示定时器从0时刻启动,每5s重复一次
  itv.it_value.tv_sec = 2;
  itv.it_value.tv_usec = 0;
  itv.it_interval.tv_sec = 1;
  itv.it_interval.tv_usec = 0;

  // 启动设置定时器,命名为ITIMER_REAL
  setitimer(ITIMER_REAL, &itv, 0);

  // 捕捉进程的SIGALRM信号,触发信号处理函数sigalrmHandler
  signal(SIGALRM, sigalrmHandler);

  for(;;){} // 注意一定要有一个让本进程一直运行的代码,才能看出定时器的效果

  return 0;

}

在Linux的环境下运行之后,由于有一个死循环存在,程序会一直运行,然后每隔2s打印信号处理函数中的信息,直到外部命令停止程序运行,如下图所示。

alarm has been triggered
alarm has been triggered
alarm has been triggered
alarm has been triggered
alarm has been triggered
alarm has been triggered
^C

 

你可能感兴趣的:(Linux,linux,c++)