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

Kir*_*rov 4 c c++ time datetime

一个简单的问题:你time(...)clock_gettime( CLOCK_REALTIME, ... )(仅就秒),理论上产生相同的时间?


这就是我的意思:

time_t epoch;
time( &epoch );
Run Code Online (Sandbox Code Playgroud)

struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );
Run Code Online (Sandbox Code Playgroud)

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

我通过改变时间和时区来"测试"这个epoch并且spec.tv_sec总是显示相同的结果,但是文档CLOCK_REATIME让我感到困惑,我不确定,它们将始终是相同的.


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


这个问题在某种程度上与Linux中的测量时间有关- 时间与时间对比getrusage vs clock_gettime vs gettimeofday vs timespec_get?但那里的信息对我来说还不够......我想.

Kos*_*nae 6

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

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

clock_gettime()是一个glibc函数sysdeps\unix\clock_gettime.c,它只是调用gettimeofday所提供的时钟ID 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_datawall_time_sec领域.该结构由update_vsyscall与上述相同的计时器结构维护.

TL;博士

答案是:是的,他们从相同的时钟源获得时间.