【问题标题】:Get CLOCK_REALTIME and CLOCK_MONOTONIC with one call一键获取 CLOCK_REALTIME 和 CLOCK_MONOTONIC
【发布时间】:2022-01-24 13:45:55
【问题描述】:

我可以使用

int clock_gettime(clockid_t clk_id, struct timespec *tp);

获取 CLOCK_REALTIME 和 CLOCK_MONOTONIC 分别调用哪个。

是否有可能通过 one 调用获得 both,因此结果是内核在我请求时对两者的最佳猜测?

背景:我需要同步两者以发现与 GPS 时间同步的 CLOCK_REALTIME 中的跳跃,我担心(不知道这是否是一种有效的恐惧)调用 clock_gettime() 两次会增加我的问题,因为我的两个电话之间可能会发生很多事情。

【问题讨论】:

  • 我很想看到那些明显不同的值;我需要用时间戳标记测量数据,但如果测量从 GPS 不可用的位置开始,我想发现稍后进行的调整以重新排序数据。此外,在例如之后很长的隧道,CLOCK_REALTIME 可能会跳跃,而 CLOCK_MONOTONIC 不会。
  • @StephenKitt 我仍然很好奇输出会是什么样子 54:3234:3752 APM?
  • 好的,抱歉。我想在调用点 A 有一个值,告诉我 MONOTONIC 是 1000,而 REALTIME 是 1000000。下一次调用,我想看到 MONOTONIC 现在是 1005,而 REALTIME 是 1000006,所以我可以看到系统内部的想法现在是时候了,我可以发现任何涂抹或跳跃。我想用两个时间戳标记数据,这样即使我不总是能够补偿,我至少可以看到它。

标签: posix timestamp


【解决方案1】:

是否有可能通过 one 调用获得 both,因此结果是内核在我请求时对两者的最佳猜测?

不,不是; clock_gettime 仅支持单个时钟标识符,并且只能填充单个 struct timespec。 POSIX 也没有定义“最佳猜测”合成时钟。

您可以通过调用clock_gettime 三次来确定单调时钟和实时时钟之间时间差的上限:检索单调时间,然后是挂钟时间,然后再次检索单调时间。这也将有助于确保时间戳的相对排序;保持这三个应该能让你理解挂钟时间的跳跃。

如果您的目标是 Linux,您可能需要使用 CLOCK_MONOTONIC_RAW or CLOCK_BOOTTIME;前者是一个单调时钟,不受adjtime 或NTP 增量调整的影响,后者也不受暂停时间的影响。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2012-06-10
    • 2023-02-12
    • 2012-12-24
    • 2014-07-05
    • 2012-12-25
    • 1970-01-01
    • 2013-01-21
    相关资源
    最近更新 更多