我使用的是周期性计时器,并在接收到两个SIGALRM信号之间进行计时。我观察到的是,itimer可能会在我设置的时间之前或之后一点过期。例如,如果我将其设置为1m sec,它可能会在0.9998msec或1.0023msec过期。
计时器过期时间不应该总是大于设定值吗?更少的时间是我不明白的。
下面是我的代码:
enter code here
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <stdlib.h>
#include <time.h>
#define INTERVAL 1000
struct timespec ti[100];
int s=0;
void ex(int i)
{int d=0;
struct timespec t[100],s1,s2;
for(d=0;d<99;d++)
{
s1= ti[d];
s2= ti[d+1];
printf("%u:%u\t%u:%u\t", s1.tv_sec, s1.tv_nsec, s2.tv_sec, s2.tv_nsec);
if ((s2.tv_nsec- s1.tv_nsec)<0) {
t[d].tv_sec = s2.tv_sec-s1.tv_sec-1;
t[d].tv_nsec = 1000000000 +s2.tv_nsec -s1.tv_nsec;
} else {
t[d].tv_sec = s2.tv_sec-s1.tv_sec;
t[d].tv_nsec = s2.tv_nsec-s1.tv_nsec;
}
printf("%u:%u\n",t[d].tv_sec,t[d].tv_nsec);
}
exit(0);
}
void alarm_wakeup (int i)
{
clock_gettime(CLOCK_MONOTONIC, &ti[s]);
s++;
if(s==100)
{ ex(0);
}
}
void main ()
{
struct itimerval tout_val;
tout_val.it_interval.tv_sec = 0;
tout_val.it_interval.tv_usec = INTERVAL;
tout_val.it_value.tv_sec = 0;
tout_val.it_value.tv_usec = INTERVAL;
setitimer(ITIMER_REAL, &tout_val,0);
signal(SIGALRM,alarm_wakeup); /* set the Alarm signal capture */
signal(SIGINT,ex);
while (1)
{
}
}发布于 2012-10-05 12:01:29
当定时器超时时,该信号被提升,并且定时器被重新调度。
但是,在被引发的信号和被处理的信号之间可能存在延迟-如果进程尚未运行,则必须重新调度它。这意味着在计时器的实际到期和信号处理程序中的clock_gettime()调用运行之间存在潜在的可变延迟。
如果clock_gettime()调用之前的此延迟在一次迭代中高于下一次迭代,则clock_gettime()调用之间的时间将略小于1ms,即使在随后的计时器超时之间有1ms的间隔。
在图表形式中:
time: 0ms...............1ms...............2ms...............3ms
timer expiry: X X X X
signal handler runs: S S S S您可以看到,在第二个信号处理程序运行之前的较长延迟使第三个信号看起来是“早”的,即使底层计时器并非如此。
https://stackoverflow.com/questions/12704644
复制相似问题