一个简单的问题:time(...)
和clock_gettime( CLOCK_REALTIME, ... )
理论上会产生相同的时间(仅限于秒数)吗?
这就是我的意思:
time_t epoch;
time( &epoch );
和
struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );
这两个应该返回完全相同的结果(相对于秒数)?
我通过更改时间和时区对此进行了“测试”,epoch
和spec.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?有某种关系,但那里的信息对我来说还不够......我想。
答案 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
维护,来自与上面相同的计时器结构。
答案是:是,他们从同一时钟源获得时间。