内核中的CLOCK_REALTIME纳秒精度支持

我编写了一个简单的程序,以确定我的系统是RHEL 5.5 VM(内核2.6.18-194),是否可以达到纳秒精度。

// cc -g -Wall ntime.c -o ntime -lrt #include <inttypes.h> #include <stdint.h> #include <stdio.h> #include <time.h> #include <unistd.h> #include <stdlib.h> int main(int argc, char* argv[]) { struct timespec spec; printf("CLOCK_REALTIME - \"Systemwide realtime clock.\":\n"); clock_getres(CLOCK_REALTIME, &spec); printf("\tprecision: %ldns\n", spec.tv_nsec); clock_gettime(CLOCK_REALTIME, &spec); printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec); printf("CLOCK_MONOTONIC - \"Represents monotonic time. Cannot be set.\":\n"); clock_getres(CLOCK_MONOTONIC, &spec); printf("\tprecision: %ldns\n", spec.tv_nsec); clock_gettime(CLOCK_MONOTONIC, &spec); printf("\tvalue : %010ld.%-ld\n", spec.tv_sec, spec.tv_nsec); return 0; } 

示例输出:

 CLOCK_REALTIME - "Systemwide realtime clock.": precision: 999848ns value : 1504781052.328111000 CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.": precision: 999848ns value : 0026159205.299686941 

所以REALTIME给我当地时间和MONOTONIC系统的正常运行时间。 尽pipeMONOTONIC输出纳秒,这两个时钟似乎有一个μs的精度(999848ns×1ms),这是令人困惑的。

man clock_gettime指出:

CLOCK_REALTIME_HR CLOCK_REALTIME的高分辨率版本。

但是, grep -R CLOCK_REALTIME_HR /usr/include/ | wc -l grep -R CLOCK_REALTIME_HR /usr/include/ | wc -l返回0并尝试编译error: 'CLOCK_REALTIME_HR' undeclared (first use in this function)结果error: 'CLOCK_REALTIME_HR' undeclared (first use in this function)

我试图确定是否可以以毫微秒的精度获取本地时间,但是我的代码有一个错误,或者这个function在5.5(或者虚拟机的HPETclosures,或者别的东西)中不完全支持。

我能在这个系统中获得纳秒的本地时间吗? 我究竟做错了什么?

编辑

那么答案似乎是没有。

虽然可以实现纳秒级的精度,但在这种情况下,系统并不能保证纳秒精度(这里有一个清晰的答案 ,而不是一个咆哮)。 典型的COTS硬件没有真正处理它(另一个正确方向的答案 )。

我仍然好奇,为什么时钟报告相同的clock_getres分辨率,而MONOTONIC产生的似乎是纳秒级的值,而REALTIME产生REALTIME微秒。

在这一点上RHEL5真的很古老,你应该考虑升级。 在较新的系统(Ubuntu 16.04)上,您的程序将生成:

 CLOCK_REALTIME - "Systemwide realtime clock.": precision: 1ns value : 1504783164.686220185 CLOCK_MONOTONIC - "Represents monotonic time. Cannot be set.": precision: 1ns value : 0000537257.257923964