2016-08-28 52 views
1

我已經用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是否正確。任何人都可以確認嗎?

此致 大安

+1

在返回的表達式中使用'||',而不是'&&'。 – Peter

+0

你打算第三個參數是'timerspec.it_value.tv_nsec == 0'嗎?當計時器有一個值時,這將評估爲'0'。我問,因爲這不符合格式規格的64位值。 –

回答

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; 
+0

非常感謝。它現在起作用了,我也誤導了,因爲我在'uint64_t'中投入'time_t'的printf語句無法正常工作。 –

3

time_t類型別名是一個算術或真實類型。算術類型和實數類型都可以通過與整數值零進行隱式比較。此外,在POSIX系統(如Linux)上,time_t被定義爲整數整數(例如參見this <sys/types.h> reference)。

儘管C標準沒有明確指定time_t的類型,但出於兼容性原因,幾乎所有的實現都使用time_t的整數。我不知道任何實現它不是一個整數。

所以你的問題的答案是,比較是正確的。

應該指出,它只是tv_sec成員的類型time_ttv_nsec成員是long