2016-08-21 104 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

相关问题