gpt4 book ai didi

c - 计时器到期

转载 作者:行者123 更新时间:2023-11-30 17:57:38 24 4
gpt4 key购买 nike

我使用了周期性计时器,并在接收到两个 SIGALRM 信号之间计算时间。我观察到,itimer 可能会在我设置的时间之前或之后不久到期。例如如果我将其设置为 1m sec ,它可能会在 0.9998msec1.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)
{
}

}

最佳答案

当计时器到期时,会发出信号并重新安排计时器。

但是,发出信号和处理信号之间可能存在延迟 - 如果进程尚未运行,则必须重新安排时间。这意味着计时器实际到期与信号处理程序中的 clock_gettime() 调用运行之间存在潜在的可变延迟。

如果 clock_gettime() 调用之前的延迟在一次迭代中高于下一次迭代,则 clock_gettime() 调用之间的时间甚至会略小于 1ms尽管随后的计时器到期之间有 1 毫秒的间隙。

以图表形式:

time:                0ms...............1ms...............2ms...............3ms
timer expiry: X X X X
signal handler runs: S S S S

您可以看到,第二个信号处理程序运行之前的较长延迟使第三个信号看起来“提前”,即使底层计时器并非如此。

关于c - 计时器到期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12704644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com