Linux计时器

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 //具体的计时器类型

  1. ITIMER_REAL :真实计时器
    • 统计进程消耗的真实时间
    • 通过定时产生SIGALRM工作
  2. ITIMER_VIRTUAL :虚拟计时器
    • 统计继承在用户态下消耗的时间
    • 通过定时产生SIGVTALRM工作
  3. 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;
}
posted @ 2016-10-07 00:12  Abnor  阅读(900)  评论(0编辑  收藏  举报