通常使用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