clock_gettime(CLOCK_REALTIME ....)和time()之间有什么区别吗?

时间:2016-08-12 08:23:46

标签: c++ c datetime time

一个简单的问题:time(...)clock_gettime( CLOCK_REALTIME, ... )理论上会产生相同的时间(仅限于秒数)吗?

这就是我的意思:

time_t epoch;
time( &epoch );

struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );

这两个应该返回完全相同的结果(相对于秒数)?

我通过更改时间和时区对此进行了“测试”,epochspec.tv_sec始终显示相同的结果,但CLOCK_REATIME的文档让我感到困惑,我不是当然,他们将永远是一样的。

真实世界的情况:我有一段代码,使用time。现在我希望以毫秒为单位(可以从spec.tv_nsec获取,乘以1000000)。所以我考虑删除time并直接使用clock_gettime,但我不确定在所有情况下这是否会保持不变。

这个问题与Measure time in Linux - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?有某种关系,但那里的信息对我来说还不够......我想。

1 个答案:

答案 0 :(得分:6)

[注意:我使用git master分支和v4.7作为下面的参考链接,仅限x86,因为我很懒。]

time()实际上是同名的系统调用的别名,调用get_seconds,发生在kernel/time/time.c。该系统调用使用get_seconds函数返回UNIX时间戳,该时间戳从核心计时结构中读取,更准确地说是从“当前CLOCK_REALTIME时间(以秒为单位)”字段(xtime_sec)中读取。

clock_gettime()sysdeps\unix\clock_gettime.c中的glibc函数,如果提供的时钟ID为gettimeofday,则只调用CLOCK_REALTIME,同样由同名的syscall支持(源在上面的time.c文件中。这个调用do_gettimeofday,最终调用__getnstimeofday64,查询来自上面相同结构的xtime_sec字段。

更新

正如@MaximEgorushkin巧妙地指出的那样,一个新的vDSO机制劫持{如果你的二进制文件取决于linux-vdso.so.*,它存在一个好的迹象)clock_gettime调用并将其重定向到__vdso_clock_gettime 。这个使用新的时钟源管理框架(gtod - Generic Time Of Day)。致电do_realtime,并从结构struct vsyscall_gtod_data的{​​{1}}字段中读取。这个结构由update_vsyscall维护,来自与上面相同的计时器结构。

TL;博士

答案是:,他们从同一时钟源获得时间。