clock_nanosleep是否受到adjtime和NTP的影响?

通常, 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_MONOTONICsetitimer()有自己的一组定时器 , alarm()使用ITIMER_REAL(与setitimer()相同) ,( 有些间接的 ) 也是我们的好朋友CLOCK_MONOTONIC 。 我们还有什么? 我猜没什么。

作为一个无关的方面,有一个有趣的观察,如果你调用clock_nanosleep()的相对时间间隔(这不是TIMER_ABSTIME ),那么CLOCK_REALTIME实际上成为CLOCK_REALTIME的同义词 。