2016-08-21 106 views
8

通常使用CLOCK_MONOTONIC_RAW來獲得不受NTP或adjtime()影響的時鐘。但clock_nanosleep()不支持CLOCK_MONOTONIC_RAW並試圖無論如何使用它將導致返回碼95 不支持操作(內核4.6.0)。clock_nanosleep是否受到adjtime和NTP的影響?

clock_nanosleep()難道不知道如何考慮這些時鐘調整或睡眠時間會受到影響嗎?

如果需要休眠時間而不受時鐘調整的影響,還有什麼選擇?

回答

2

CLOCK_MONOTONIC_RAW從來沒有支持clock_nanosleep(),因爲它在Linux 2.6.28中爲was introduced。它也是explicitly fixed在2.6.32 because of oopses沒有這種支持。代碼在此之後被重構了幾次,但仍然不支持clock_nanosleep()中的CLOCK_MONOTONIC_RAW,我無法在上找到任何意見,爲什麼就是這樣。

至少有一個補丁明確地禁用了這個功能,並且它通過了所有評論,這告訴我們它對內核開發者來說不是一個大問題。所以,目前(4.7)the only things CLOCK_MONOTONIC_RAW supportsclock_getres()clock_gettime()

說到調整,如already noted by RichCLOCK_MONOTONIC受利率調整隻是由該時鐘的性質。發生這種情況是因爲hrtimer_interrupt()以調整後的單調時間值運行其隊列(ktime_get_update_offsets_now()timekeeping_get_ns()timekeeping_delta_to_ns()並且與xtime_nsec一起運行,即subject to adjustment)。其實,看看這段代碼,我可能不再感到驚訝,CLOCK_MONOTONIC_RAW不支持clock_nanosleep()(並且將來可能不會有)—調整後的單調時鐘使用似乎是時間片的基礎。

至於替代品,我認爲沒有。 nanosleep() uses the same CLOCK_MONOTONICsetitimer() has its own set of timers,alarm() uses ITIMER_REAL (same as setitimer()),即(with some indirection)是also our good old friend CLOCK_MONOTONIC。我們還有什麼?我猜沒什麼。

作爲一個無關的方面說明,有一個有趣的觀察,如果您撥打clock_nanosleep()相對區間(這不是TIMER_ABSTIME),然後CLOCK_REALTIME actually becomes a synonym for CLOCK_MONOTONIC

+1

非常有幫助的答案,謝謝你的努力。所以根據[Rich的回答](http://stackoverflow.com/a/39064645/165063)'CLOCK_MONOTONIC'比'CLOCK_MONOTONIC_RAW'更準確,因此更適合小睡眠,特別是因爲'adjtime'調整對於短時間間隔可以忽略不計。 – scai

相關問題