1

我无法理解由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和我设置的一样吗?

4

0 回答 0