首页 > 编程知识 正文

linux定时器精度,linux定时器实现原理

时间:2023-05-05 04:17:06 阅读:111072 作者:4374

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;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。