通常CLOCK_MONOTONIC_RAW
用于获取不受NTP或adjtime()
影响的时钟。但是clock_nanosleep()
不支持CLOCK_MONOTONIC_RAW
并且无论如何都要尝试使用它将导致返回代码95 不支持操作(内核4.6.0)。
clock_nanosleep()
是否会以某种方式考虑这些时钟调整,或者睡眠时间会受到影响吗?
如果需要一个不应受时钟调整影响的休眠时间,有哪些替代方案?
答案 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
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
运行CLOCK_MONOTONIC_RAW
{3}})。实际上,看看这段代码我可能不再感到惊讶clock_nanosleep()
不支持clock_nanosleep()
(并且可能在将来不会有它) - 调整后的单调时钟使用似乎是hrtimers的基础。
至于替代方案,我认为没有。 subject to adjustment,nanosleep()
uses the same CLOCK_MONOTONIC
,setitimer()
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
。