来自setitimer

时间:2017-04-01 11:21:57

标签: c setitimer

我很难理解由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吗?

0 个答案:

没有答案