通常, CLOCK_MONOTONIC_RAW
用于获取不受NTP或adjtime()
影响的时钟。 但是, clock_nanosleep()
不支持CLOCK_MONOTONIC_RAW
并试图使用它将导致返回代码95 操作不支持 (内核4.6.0)。
clock_nanosleep()
是否考虑了这些时钟调整,或睡眠时间会受到影响?
如果需要睡眠时间,不应该受到时钟调整的影响,还有什么select?
CLOCK_MONOTONIC_RAW
在Linux 2.6.28 中引入后 ,从来没有支持clock_nanosleep()
。 2.6.32中也没有明确规定这个支持是因为OOP 。 之后,代码被重构了好几次,但是clock_nanosleep()
仍然没有CLOCK_MONOTONIC_RAW
支持,我不能在这里找到任何评论。
至少,有一个补丁明确地禁用了这个功能,并且通过了所有评论,这告诉我们内核开发者看起来不是什么大问题。 所以,现在(4.7) CLOCK_MONOTONIC_RAW
只支持 clock_getres()
和clock_gettime()
。
说到调整,正如Rich CLOCK_MONOTONIC
已经提到的那样,只是按照这个时钟的性质来调整速率。 发生这种情况是因为hrtimer_interrupt()
以调整的单调时间值( ktime_get_update_offsets_now() – > timekeeping_get_ns() – > hrtimer_interrupt()
运行其队列,并使用xtime_nsec
进行调整 。 其实,看看这个代码,我可能不会再感到惊讶, CLOCK_MONOTONIC_RAW
不支持clock_nanosleep()
(以后也许不会有这个功能) – 调整后的单调时钟的使用似乎是hrtimers的基础。
至于替代品,我认为没有。 nanosleep()
使用相同的CLOCK_MONOTONIC
, setitimer()
有自己的一组定时器 , alarm()
使用ITIMER_REAL(与setitimer()
相同) ,( 有些间接的 ) 也是我们的好朋友CLOCK_MONOTONIC
。 我们还有什么? 我猜没什么。
作为一个无关的方面,有一个有趣的观察,如果你调用clock_nanosleep()
的相对时间间隔(这不是TIMER_ABSTIME
),那么CLOCK_REALTIME
实际上成为CLOCK_REALTIME
的同义词 。