一个简单的问题:理论上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
,但我不确定这是否在所有情况下都保持不变。
这个问题在某种程度上与 Linux 中的测量时间有关 - 时间 vs 时钟 vs getrusage vs clock_gettime vs gettimeofday vs timespec_get? 但是那里的信息对我来说还不够。.我认为。
[注意:我使用了 git master 分支和 v4.7 作为下面的参考链接,仅限 x86,因为我很懒。
time()
实际上是同名系统调用的别名,它调用get_seconds
,发生在kernel/time/time.c
。该系统调用使用 get_seconds
函数返回 UNIX 时间戳,该时间戳是从核心计时结构中读取的,更准确地说是从"当前CLOCK_REALTIME时间(秒("字段 (xtime_sec
( 中读取的。
clock_gettime()
是 sysdepsunixclock_gettime.c
中的一个 glibc 函数,如果提供的时钟 ID CLOCK_REALTIME
,它只是简单地调用 gettimeofday
,它再次由同名的系统调用支持(源在上面的同一个time.c
文件中(。这个调用do_gettimeofday
,最终调用__getnstimeofday64
,查询...来自与上述相同结构的相同xtime_sec
字段。
更新:
正如@MaximEgorushkin巧妙地指出的那样,一种新的 vDSO 机制劫持了(如果您的二进制文件依赖于linux-vdso.so.*
,则存在一个好兆头(clock_gettime
调用并将其重定向到 __vdso_clock_gettime
。这个使用一个新的时钟源管理框架(gtod - 通用时间一天(。对do_realtime
的调用,它从结构中读取,struct vsyscall_gtod_data
的wall_time_sec
字段。此结构由 update_vsyscall
维护,与上述相同的计时器结构。
博士
答案是:是的,他们从同一个时钟源获取时间。