我很难理解由setitimer
填充的计时器值。
我有以下代码
#include <sys/time.h>
#include <stdio.h>
#include <signal.h>
struct itimerval defaultTimer = {{0, 2}, {0, 2}};
struct itimerval disabledTimer = {{0, 0}, {0, 0}};
void busy_wait(int iterations)
{
int count = 0;
for (int i = 0; i < iterations; i++)
{
count++;
}
}
int main()
{
// ignore SIGVTALRM
struct sigaction sa = { .sa_handler = SIG_IGN };
sigaction(SIGVTALRM, &sa, NULL);
if (setitimer(ITIMER_VIRTUAL, &defaultTimer, NULL) != 0)
{
return -1;
}
struct itimerval timer;
while (true)
{
setitimer(ITIMER_VIRTUAL, &disabledTimer, &timer);
setitimer(ITIMER_VIRTUAL, &timer, NULL);
busy_wait(10000000);
printf("timer.it_value: %lu.%lu\n", timer.it_value.tv_sec, timer.it_value.tv_usec);
printf("timer.it_interval: %lu.%lu\n", timer.it_interval.tv_sec, timer.it_interval.tv_usec);
}
}
如您所见,我正试图“暂停”计时器并立即恢复。按原样运行代码会生成类似这些
的输出行timer.it_value: 0.4000
timer.it_interval: 0.4000
,没有别的。在循环内第二次调用setitimer
之后,定时器结构不应该保存当前定时器的值吗?如果是这样,为什么我看不到timer.it_value
的价值在下降?
另一个奇怪的事情是,当删除循环中的行busy_wait(10000000);
时,我会看到timer.it_value
的不同增加值,例如
timer.it_value: 60.404000
timer.it_interval: 0.4000
...
timer.it_value: 489.256000
timer.it_interval: 0.4000
...
timer.it_value: 2391.108000
timer.it_interval: 0.4000
这些数字是什么意思?根据{{1}}手册
定时器从it_value递减到零,生成信号并重置 to it_interval。
但这与我在这里看到的结果形成鲜明对比
此外,为什么setitimer
的值为timer.it_interval.tv_usec
?不应该像我设定的那样4000
吗?