linux - clock_nanosleep 是否受 adjtime 和 NTP 影响?

标签 linux time timer linux-kernel

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

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

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

最佳答案

CLOCK_MONOTONIC_RAW 从未支持 clock_nanosleep(),因为它 was introduced在 Linux 2.6.28 中。也是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 Rich CLOCK_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() 感到惊讶(并且将来可能不会支持)——调整后的单调时钟使用似乎是 hrtimers 的基础。

至于替代品,我认为没有。 nanosleep() uses the same CLOCK_MONOTONIC , setitimer() has its own set of timers , alarm() uses ITIMER_REAL (same as setitimer()) , 那 ( with some indirection ) 是 also our good old friend CLOCK_MONOTONIC .我们还有什么?我想没什么。

作为一个不相关的旁注,有一个有趣的观察,如果您为相对间隔(不是 TIMER_ABSTIME)调用 clock_nanosleep(),那么 CLOCK_REALTIME actually becomes a synonym for CLOCK_MONOTONIC .

关于linux - clock_nanosleep 是否受 adjtime 和 NTP 影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39061851/

相关文章:

linux - 如何将 bash 命令分组为一个函数?

c - PIT 不向 IRQ0 发送中断

c++ - 位成员倒序?

c++ - 如何使用 mktime 尊重时区

java - Spring Boot 记录器换行符

php - 以周为单位分配一个月,并包含开始日期和结束日期数组

java - 为什么时间计算不正确?

php - MySql数据库排除A.M, P.M, from datetime, timestamp, time, PHP, SQL

java - Android:暂停/恢复定时器或线程

javascript - 防止隐藏选项卡上的 Chrome 计时器以 1 秒分辨率运行