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