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?但那里的信息对我来说还不够......我想.
[注意:我使用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_data
的wall_time_sec
领域.该结构由update_vsyscall
与上述相同的计时器结构维护.
答案是:是的,他们从相同的时钟源获得时间.