clock_nanosleep受adjtime和NTP的影响吗?

时间:2016-08-21 07:26:40

标签: linux time timer linux-kernel

通常CLOCK_MONOTONIC_RAW用于获取不受NTP或adjtime()影响的时钟。但是clock_nanosleep()不支持CLOCK_MONOTONIC_RAW并且无论如何都要尝试使用它将导致返回代码95 不支持操作(内核4.6.0)。

clock_nanosleep()是否会以某种方式考虑这些时钟调整,或者睡眠时间会受到影响吗?

如果需要一个不应受时钟调整影响的休眠时间,有哪些替代方案?

1 个答案:

答案 0 :(得分:3)

CLOCK_MONOTONIC_RAW从未支持clock_nanosleep(),因为它在Linux 2.6.28中was introduced。在{2.6} explicitly fixed中也没有这种支持because of oopses。在此之后,代码已经多次重构,但CLOCK_MONOTONIC_RAW中仍然没有对clock_nanosleep()的支持,而且我无法找到关于为什么的任何评论这一点。

至少,有一个明确禁用此功能并通过所有评论的补丁的事实告诉我们,它对于内核开发人员来说并不是一个大问题。所以,目前(4.7)the only things CLOCK_MONOTONIC_RAW supportsclock_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运行CLOCK_MONOTONIC_RAW {3}})。实际上,看看这段代码我可能不再感到惊讶clock_nanosleep()不支持clock_nanosleep()(并且可能在将来不会有它) - 调整后的单调时钟使用似乎是hrtimers的基础。

至于替代方案,我认为没有。 subject to adjustmentnanosleep() uses the same CLOCK_MONOTONICsetitimer() has its own set of timers,(alarm() uses ITIMER_REAL (same as setitimer()))是with some indirection。我们还有什么?我什么都没想。

作为一个不相关的旁注,有一个有趣的观察结果,如果你打电话给TIMER_ABSTIME相对间隔(不是SELECT * FROM users WHERE username = "myname" AND password = sha256("mypass") AND activation = 1 ),那么also our good old friend CLOCK_MONOTONIC