我已經用epoll和timerfd linux API編寫了一個定時器eventloop。的timerfd_gettime
的magpage規定如下:檢查time_t是否爲零
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上運行的程序。
在我將其標記爲內核實現中的一個bug之前,我想知道通過執行time_t == 0
來檢查time_t
是否爲0是否正確。任何人都可以確認嗎?
此致 大安
在返回的表達式中使用'||',而不是'&&'。 – Peter
你打算第三個參數是'timerspec.it_value.tv_nsec == 0'嗎?當計時器有一個值時,這將評估爲'0'。我問,因爲這不符合格式規格的64位值。 –