Linux中的定时器的使用与三个定时器ITIMER_REAL,ITIMER_VIRTUAL,ITIMER_PROF的区别

Linux中的定时函数

定时函数 默认绑定 SIGALRM信号

alarm (只发一次)
unsigned int alarm(unsigned int seconds);

函数会在所指定的seconds之后收到SIGALRM信号

例如:

signal(SIGALRM,printf);
alarm(2);

函数会在两秒之后触发SIGALRM信号,执行printf函数

ualarm (循环发送)
 useconds_t ualarm(useconds_t usecs, useconds_t interval);
 以useconds为单位,第一个参数为第一次产生时间,第二个参数为间隔产生
setitimer 定时器

int getitimer(int which, struct itimerval *curr_value); //获取定时器
int setitimer(int which, const struct itimerval *new_value,struct itimerval *old_value); //设置定时器
面向itimerval编程
Linux会给进程提供三个定时器
ITIMER_REAL: 以逝去时间递减
ITIMER_VIRTUAL: 计算在应用层递减的时间不计算在内核层的递减的时间
ITIMER_PROF; 递减时间更为精确 会减去在系统中阻塞的时间

        struct itimerval {
               struct timeval it_interval; /* next value */     间隔时间
               struct timeval it_value;    /* current value */  第一次到点的时间
           };

           struct timeval {
               time_t      tv_sec;         /* seconds */
               suseconds_t tv_usec;        /* microseconds */
           };

定时器的基本使用demo:

//purpose: 显示了设置闹钟的方法
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/time.h>

void sigroutine(int signo) {
        switch (signo) {
                case SIGALRM:
                        printf("Catch a signal -- SIGALRM\n");
                        break;
                case SIGVTALRM:
                        printf("Catch a signal -- SIGVTALRM\n");
                        break;
        }
}

int main(int argc, char ** argv) {
        struct itimerval value,ovalue,value2;

        printf("process id is %d\n",getpid());
        signal(SIGALRM, sigroutine);
        signal(SIGVTALRM, sigroutine);

        value.it_value.tv_sec = 1;
        value.it_value.tv_usec = 0;
        value.it_interval.tv_sec = 1;
        value.it_interval.tv_usec = 0;
        setitimer(ITIMER_REAL, &value, &ovalue); 

        value2.it_value.tv_sec = 0;
        value2.it_value.tv_usec = 500000;
        value2.it_interval.tv_sec = 0;
        value2.it_interval.tv_usec = 500000;
        setitimer(ITIMER_VIRTUAL, &value2, &ovalue); 

        for (;;) ;
} 

运行效果

在这里插入图片描述

三个定时器的区别demo:

ITIMER_REAL: 以逝去时间递减
ITIMER_VIRTUAL: 计算在应用层递减的时间不计算在内核层的递减的时间
ITIMER_PROF; 递减时间更为精确 会减去在系统中阻塞的时间

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

int main(void)
{	
	struct itimerval setvalue;
	setvalue.it_interval.tv_sec=3;
	setvalue.it_interval.tv_usec=0;
	setvalue.it_value.tv_sec=3;
	setvalue.it_value.tv_usec=0;
	setitimer(ITIMER_REAL,&setvalue,NULL);
	
	setvalue.it_interval.tv_sec=3;
	setvalue.it_interval.tv_usec=0;
	setvalue.it_value.tv_sec=3;
	setvalue.it_value.tv_usec=0;
	setitimer(ITIMER_VIRTUAL,&setvalue,NULL);

	setvalue.it_interval.tv_sec=3;
	setvalue.it_interval.tv_usec=0;
	setvalue.it_value.tv_sec=1;
	setvalue.it_value.tv_usec=0;
	setitimer(ITIMER_PROF,&setvalue,NULL);

	while(1)
	{
		struct itimerval value;
		getitimer(ITIMER_REAL,&value);
		printf("ITIMER_REAL: internal:%ds%dms,remain:%ds%dms\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);

		getitimer(ITIMER_VIRTUAL,&value);
		printf("ITIMER_VIRTUAL:internal:%ds%dms,remain:%ds%dms\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);

		getitimer(ITIMER_PROF,&value);
		printf("ITIMER_PROF: internal:%ds%dms,remain:%ds%dms\n\n",value.it_interval.tv_sec,value.it_interval.tv_usec,value.it_value.tv_sec,value.it_value.tv_usec);
		sleep(1);
	}
}

运行效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_45309916/article/details/107460918