通常CLOCK_MONOTONIC_RAW
用于获取不受NTP或adjtime()
影响的时钟。但是 clock_nanosleep()
不支持 CLOCK_MONOTONIC_RAW
并且无论如何尝试使用它都会导致返回代码 95 Operation not supported(内核 4.6.0 ).
clock_nanosleep()
是否以某种方式考虑了这些时钟调整,或者 sleep 时间是否会受到影响?
如果需要不受时钟调整影响的休眠时间,有哪些替代方案?
最佳答案
CLOCK_MONOTONIC_RAW
从未支持 clock_nanosleep()
,因为它 was introduced在 Linux 2.6.28 中。也是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 Rich CLOCK_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()
感到惊讶(并且将来可能不会支持)——调整后的单调时钟使用似乎是 hrtimers 的基础。
至于替代品,我认为没有。 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
.我们还有什么?我想没什么。
作为一个不相关的旁注,有一个有趣的观察,如果您为相对间隔(不是 TIMER_ABSTIME
)调用 clock_nanosleep()
,那么 CLOCK_REALTIME
actually becomes a synonym for CLOCK_MONOTONIC
.
关于linux - clock_nanosleep 是否受 adjtime 和 NTP 影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061851/