无聊之中,学习了一下setitimer函数的使用,整理一下,做个记录。
getitimer,setitimer - get or set value of an interval timer,man的第一句话是这样写的。其中的用法写的很详细了。
函数原型: setitimer(int which,const struct itimerval *value,struct itimerval *ovalue)
- 参数一表示了计时器的类别,共分3种
<!---摘自网络
ITIMER_REAL:减少实际时间.到时的时候发出SIGALRM信号。
ITIMER_VIRTUAL:减少有效时间(进程执行的时间).产生SIGVTALRM信号。
ITIMER_PROF:减少进程的有效时间和系统时间(为进程调度用的时间)。这个经常和上面一个使用用来计算系统内核时间 和用户时间.产生SIGPROF信号。
-------------->
- 参数二是itimerval结构指针,对于itimerval我们需要定义
itimerval.it_value.tv_sec,
itimerval.it_value.tv_usec,
itimerval.it_interval.tv_sec,
itimerval.it_interval.tv_usec,
分别表示了第一次执行时间,单位s;第一次执行时间,单位ms;间隔时间,单位s,间隔时间,单位ms。
计时器是递减的,时间到零后触发signal。下边的小程序运行5s后输出第一个hello!!,以后每隔一秒输出一次hello!!
供大家参考
timer.h
#ifndef TIMER_H
#define TIMER_H
struct itimerval tval;
void settimer(unsigned int,unsigned int,unsigned int,unsigned int);
void msg();
void quite();
#endif
timer.c
#include
#include
#include
#include
#include
#include "timer.h"
int main()
{
settimer(5,0,1,0);
signal(SIGALRM,msg);
signal(SIGINT,quite);
for(;;);
return 0;
}
void msg()
{
printf("hello world!!\n");
}
void quite()
{
printf("received interrupt[CTRL+C] signal,exit process!\n");
exit(0);
}
void settimer(unsigned int ue_sec,unsigned int ue_usec,unsigned int val_sec,unsigned int val_usec)
{
int res=0;;
memset(&tval,0,sizeof(tval));
tval.it_value.tv_sec=ue_sec;
tval.it_value.tv_usec=ue_usec;
tval.it_interval.tv_sec=val_sec;
tval.it_interval.tv_usec=val_usec;
tval=tval;
res=setitimer(ITIMER_REAL,&tval,NULL);
if(res)
{
printf("set timer failed!\n");
}
}