目录
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<iostream>
#include <signal.h>
#include <sys/time.h>
#include <time.h>
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