clock_gettime( CLOCK_REALTIME .. ) 和 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,但我不确定这是否在所有情况下都保持不变。


这个问题在某种程度上与 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_datawall_time_sec字段。此结构由 update_vsyscall 维护,与上述相同的计时器结构。

博士

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

相关内容

  • 没有找到相关文章

最新更新