检查time_t是否为零

时间:2016-08-28 12:51:46

标签: c linux timer time-t

我用epoll和timerfd linux API编写了一个计时器eventloop。 timerfd_gettime的magpage说明如下:

The it_value field returns the amount of time until the timer will
next expire.  If both fields of this structure are zero, then the
timer is currently disarmed.

因此,为了检查计时器当前是否已装备或撤防,我已编写以下代码:

bool timer_is_running(struct timer *timer)
{
    struct itimerspec timerspec;

    if(timerfd_gettime(timer->_timer_fd, &timerspec) == -1) {
        printf("[TIMER] Could not  get timer '%s' running status\n", timer->name);
        return false;
    }

    printf("[TIMER] Checking running state of timer '%s' it_value.tv_sec = %"PRIu64", it_value.tv_nsec = %"PRIu64"\n", timer->name, (uint64_t) timerspec.it_value.tv_sec, (uint64_t) timerspec.it_value.tv_nsec == 0);
    return timerspec.it_value.tv_sec != 0  && timerspec.it_value.tv_nsec != 0;
}

这不起作用,所有计时器都被报告为解除武装。当我查看输出时,我在当前解除武装的计时器上看到以下内容:

[TIMER] Checking running state of timer 'test' it_value.tv_sec = 0, it_value.tv_nsec = 4302591840

经过进一步调查后,似乎只有tv_sec字段在撤防的计时器上设置为0。

这是程序在MIPS架构(OpenWRT)上的内核3.18.23上运行。

在我将此标记为内核实现中的错误之前,我想知道通过time_t检查time_t == 0是否为0是否正确。谁能证实这一点?

亲切的问候, 大安

2 个答案:

答案 0 :(得分:3)

time_t类型别名是算术或实数类型。算术和实数类型都可以隐式地与整数值零进行比较。

此外,在POSIX系统(如Linux)上,time_t被定义为整数(参见例如this <sys/types.h> reference)。

虽然C标准没有明确指定time_t的类型,但出于兼容性原因,几乎所有实现都使用time_t的整数。我不知道任何不是整数的实现。

所以你的问题的答案是比较是正确的。

应该注意的是,它只是属于tv_sec类型的time_t成员。 tv_nsec成员是long

答案 1 :(得分:3)

这不是内核实现中的错误。这是你的代码有缺陷。

  

it_value字段返回计时器之前的时间量   下一个到期。如果这个结构的两个字段都是零,那么   计时器目前已解除武装。

与此相反的是(假设呼叫timerfd_gettime()成功),如果结构的一个或两个字段非零,则计时器被设防。

你的函数的最后一个return语句是

return timerspec.it_value.tv_sec != 0  && timerspec.it_value.tv_nsec != 0;

仅在字段非零时才返回true。相反,您需要使用

return timerspec.it_value.tv_sec != 0  || timerspec.it_value.tv_nsec != 0;