clock_monotonic_raw在2.6.28之前的Linux版本中的替代

clock_monotonic_raw仅支持Linux 2.6.28。

有没有另一种方法我可以得到不受NTP调整的单调时间或由调整进行的增量调整? 我不能使用clock_monotonic,因为它受到NTP&adjtime的影响。

仔细看看CLOCK_MONOTONIC而不是CLOCK_MONOTONIC_RAW。 我想用条件等待来使用CLOCK_MONOTONIC_RAW,但是发现它不被支持(Fedora 25 / Linux 4.10.17)。

这种情况隐约令人愤怒,但根据我目前的理解,Linux上的结果是:

  1. CLOCK_MONOTONIC_RAW是最接近以恒定频率运行的方波累加器。 但是,这比你想象的要少得多。

  2. CLOCK_MONOTONIC以CLOCK_MONOTONIC_RAW为基础,应用了一些渐进的频率修正,使其最终超过或落后于其他时钟基准。 NTP和adjtime都可以做出这些更正。 但是,为了避免像打破软件构建这样的事情,时钟仍然保证单调前进

“adjtime()对时钟做的调整是这样进行的,即时钟总是单调递增的。” –adjtime手册页

“你躺着混蛋。” – 我

  1. 是的 – 这是计划,但在2.6.32.19之前的内核版本中存在缺陷; 请参阅此处的讨论: https : //stackoverflow.com/a/3657433/3005946其中包含指向修补程序的链接,如果这会影响到您。 我很难说出那个错误的最大错误是什么(我真的很想知道)。

  2. 即使在4.x内核中,大多数POSIX同步对象似乎也不支持CLOCK_MONOTONIC_RAW或CLOCK_MONOTONIC_COARSE。 我已经找到了困难的方式。 总是错误检查你的* _时钟调用。

  3. POSIX信号量(sem_t)根本不支持任何单调时钟,这真是令人生气。 如果你需要这个,你将不得不自己使用条件等待。 (作为一个奖励,这样做可以让你的信号量负初始水平,这可以很方便。)

  4. 如果你只是试图让一个同步对象的等待函数永远死锁,并且你有三秒钟的救助,那么你可以直接使用CLOCK_MONOTONIC来调用CLOCK_MONOTONIC所做的调整。 ,有效地进行抖动校正,远低于您的精度要求。 即使在有问题的实现中,CLOCK_MONOTONIC也不会一小时后跳回来。 同样,反过来,像adjtime这样的事情会调整时钟的频率,使其逐渐超越或落后于其他一些并行运行的时钟。

  5. CLOCK_REALTIME实际上是CLOCK_MONOTONIC和其他一些校正因子。 或者相反。 无论如何,这是相同的事情。 重要的部分是,如果有任何机会,你的应用程序将改变时区(移动车辆,飞机,船只,巡航导弹,滑轮半机械人)或遇到管理时钟调整,你绝对不应该使用CLOCK_REALTIME,或任何需要它的东西。 同样的事情,如果服务器使用夏令时而不是UTC。 但是,如果需要的话,使用UTC的固定服务器也可以使用CLOCK_REALTIME避免粗略的死锁。 尽管如此,除非你使用的是2.6以前版本的内核,并且别无选择。

  6. CLOCK_MONOTONIC_RAW是不是你想用于时间戳。 它还没有被抖动校正,等等。它可能适用于DAC和ADC等,但不是你想用来在人类可辨别的时间尺度上记录事件。 我们有NTP的原因。

希望这是有帮助的,我当然可以理解这种挫折感。