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;
}

相关推荐