通常使用CLOCK_MONOTONIC_RAW
來獲得不受NTP或adjtime()
影響的時鐘。但clock_nanosleep()
不支持CLOCK_MONOTONIC_RAW
並試圖無論如何使用它將導致返回碼95 不支持操作(內核4.6.0)。clock_nanosleep是否受到adjtime和NTP的影響?
clock_nanosleep()
難道不知道如何考慮這些時鐘調整或睡眠時間會受到影響嗎?
如果需要休眠時間而不受時鐘調整的影響,還有什麼選擇?
通常使用CLOCK_MONOTONIC_RAW
來獲得不受NTP或adjtime()
影響的時鐘。但clock_nanosleep()
不支持CLOCK_MONOTONIC_RAW
並試圖無論如何使用它將導致返回碼95 不支持操作(內核4.6.0)。clock_nanosleep是否受到adjtime和NTP的影響?
clock_nanosleep()
難道不知道如何考慮這些時鐘調整或睡眠時間會受到影響嗎?
如果需要休眠時間而不受時鐘調整的影響,還有什麼選擇?
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
supports是clock_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_MONOTONIC
,setitimer()
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
。
非常有幫助的答案,謝謝你的努力。所以根據[Rich的回答](http://stackoverflow.com/a/39064645/165063)'CLOCK_MONOTONIC'比'CLOCK_MONOTONIC_RAW'更準確,因此更適合小睡眠,特別是因爲'adjtime'調整對於短時間間隔可以忽略不計。 – scai