我无法理解由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
这些数字是什么意思?根据setitimer
手册
计时器从 it_value 递减到零,生成一个信号,然后重置为 it_interval。
但这与我在这里看到的结果相反。
此外,为什么timer.it_interval.tv_usec
有价值4000
?不应该2
和我设置的一样吗?