【问题标题】:Equivalent to GetTickCount() on Linux等效于 Linux 上的 GetTickCount()
【发布时间】:2011-02-26 20:21:32
【问题描述】:

我正在寻找与 Linux 上的 GetTickCount() 等效的版本。

目前我正在使用 Python 的 time.time(),它可能会调用 gettimeofday()。我担心的是,如果时钟被 NTP 弄乱,返回的时间(unix 纪元)可能会发生不规律的变化。一个简单的过程或系统挂墙时间,仅以恒定速率正增加就足够了。

C 或 Python 中是否存在这样的时间函数?

【问题讨论】:

标签: python c linux time


【解决方案1】:

您可以使用CLOCK_MONOTONIC,例如在 C 中:

struct timespec ts;
if(clock_gettime(CLOCK_MONOTONIC,&ts) != 0) {
 //error
}

查看此问题以了解 Python 方式 - How do I get monotonic time durations in python?

【讨论】:

  • 在非常古老的 Linux 系统上,您可以使用 /proc/uptime 作为单调时间源。笨重但有效。
  • 联机帮助页上有一条注释:CLOCK_MONOTONIC_RAW(自 Linux 2.6.28 起;Linux 特定)类似于 CLOCK_MONOTONIC,但提供对基于硬件的原始时间的访问,而不是受 NTP 调整的影响。这是否意味着CLOCK_MONOTONIC_RAW更合适?
  • @MattJoiner:CLOCK_MONOTONIC_RAW 谈到 NTP 调整时,指的是时钟的速率,而不是绝对值。 CLOCK_MONOTONIC 不会跳过(顾名思义),通常是正确的选择。
  • 这个关于 CLOCK_MONOTONIC 的问题可能值得一试:stackoverflow.com/questions/3657289/…
【解决方案2】:

这似乎有效:

#include <unistd.h>
#include <time.h>

uint32_t getTick() {
    struct timespec ts;
    unsigned theTick = 0U;
    clock_gettime( CLOCK_REALTIME, &ts );
    theTick  = ts.tv_nsec / 1000000;
    theTick += ts.tv_sec * 1000;
    return theTick;
}

是的,get_tick() 是我的应用程序的支柱。 每个“任务”由一个状态机组成 例如,可以在不使用线程和进程间通信的情况下执行多任务 可以实现非阻塞延迟。

【讨论】:

    【解决方案3】:

    您应该使用:clock_gettime(CLOCK_MONOTONIC, &amp;tp);。此调用与 Windows 上的 GetTickCount() 一样不受系统时间调整的影响。

    【讨论】:

      【解决方案4】:

      是的,内核有高分辨率的计时器,但它是不同的。我建议您查看以可移植方式包装它的任何奇怪项目的来源。

      在 C/C++ 中,我通常使用 #ifdef 这个并在 Linux 上使用 gettimeofday(),这给了我微秒级的分辨率。我经常将它作为一个分数添加到自纪元以来的秒数中,我也收到了双倍。

      【讨论】:

        猜你喜欢
        • 2012-06-08
        • 1970-01-01
        • 2014-05-14
        • 2020-08-18
        • 1970-01-01
        • 2018-11-26
        • 2012-11-08
        • 1970-01-01
        相关资源
        最近更新 更多