Linux中, 系统为每个系统都维护了三种计时器,分别为: 真实计数器, 虚拟计时器以及实用计时器, 一般情况下都使用真实计时器
getitimer()/setitimer()
//读取/设置内部计时器
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);
which //具体的计时器类型
- ITIMER_REAL :真实计时器
- 统计进程消耗的真实时间
- 通过定时产生SIGALRM工作
- ITIMER_VIRTUAL :虚拟计时器
- 统计继承在用户态下消耗的时间
- 通过定时产生SIGVTALRM工作
- ITIMER_PROF :实用计时器
- 统计进程在用户态和内核态消耗的总时间
- 通过定时产生SIGPROF工作
new_value://结构体指针, 用于设计计时器的新值
old_value://结构体指针, 用于获取计时器的旧值
struct itimerval {
struct timeval it_interval; /* next value */
struct timeval it_value; /* current value */
};
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds *///10^6
}
//timer
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/time.h>
#include<signal.h>
#include<sys/types.h>
void fa(int signo){
printf("random\n");
}
int main(){
//设置对信号SIGALRM进行自定义处理
if(SIG_ERR==signal(SIGALRM,fa))
perror("signal"),exit(-1);
struct itimerval timer;
//设置间隔时间
timer.it_interval.tv_sec=2;
timer.it_interval.tv_usec=300000;
//设置启动时间
timer.it_value.tv_sec=5;
timer.it_value.tv_usec=0;
int res=setitimer(ITIMER_REAL,&timer,NULL);
if(-1==res)
perror("setitimer"),exit(-1);
getchar();
itimer.it_value.tv_sec=0;
setitimer(ITIMER_REAL,&timer,NULL); //没有错误处理
while(1);
return 0;
}