1 .介绍
在linux上,如果要求计时不太准确的话,使用alarm () (和signal ) )就可以了,但是如果想实现高精度的计时功能的话,就使用setitimer函数。
setitimer ) )是Linux的API,而不是c语言的标准库。 setitimer ) )具有指定固定时间后执行函数的功能,以及每帧执行固定函数的功能。 如何使用以下程序demo
2 .函数参数
1intsetitimer(intwhich,const struct itimerval *value,struct itimerval *ovalue ); 2
3 struct itimerval {4structtimevalit _ interval; 5 structtimeval it_value; 6 }; 7 structtimeval {8 longtv_sec; 9 longtv_usec; 10 );
其中,which是计时器类型,第三种类型的计时器如下:
ITIMER_REAL:按系统的实际时间进行计算,并发送SIGALRM信号。
ITIMER_VIRTUAL: -按用户状态下此进程所用的时间计算,并发送SIGVTALRM信号。
ITIMER_PROF:计算该进程在用户状态和内核状态下所用的时间,并发送SIGPROF信号。
第二个参数指定间隔时间,第三个参数用于返回上一个计时器的间隔时间。 如果您对该值不感兴趣,可以将其设置为NULL。
it_interval指定间隔时间,it_value指定初始定时时间。 如果只指定it_value,则实现一次计时;如果同时指定了it_interval,则超时后,系统将it_value重新初始化为it_interval,并执行重复计时两个都清除的话,计时器就会被清除。
注意,tv_sec提供秒水平的精度,tv_usec提供微秒水平的精度,以较大值为优先,其中1s=1000000us。
如果通过setitimer提供的计时器休眠,则只需屏蔽计时器信号并等待即可。
setitimer ) )调用成功返回0,否则返回-1。
3 .样品
示例程序每1s生成一行标准输出。
#include //printf (
#include //pause (
#include //signal (
#include //memset (
#include //struct itimerval,setitimer () ) ) )。
静态计数=0; 是voidprintmes(intsigno )
{
printf(getaSIGalrm,%d counts! n ',count;
}intmain () ) )。
{int res=0; structitimerval tick;
signal(SIGalrm,printMes );
memset(tick,0,sizeof ) tick ); //Timeout to run first time
tick.it_value.tv_sec=1;
tick.it_value.tv_usec=0; //After first,the Interval time for clock
tick.it_interval.tv_sec=1;
tick.it_interval.tv_usec=0; if(setitimer(itimer_real,tick,NULL )0) ) ) ) )。
printf (设置失败! n '; //When get a SIGALRM,themainprocesswillenteranotherloopforpause (
while(1)。
{
pause (;
}return 0;
}