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

8
一个简单的问题:在理论上(仅考虑秒),time(...)clock_gettime(CLOCK_REALTIME,...)是否产生相同的时间?
这是我的意思:
time_t epoch;
time( &epoch );

并且

struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );

这两个函数返回的结果是否完全相同(以秒为单位)?
我通过更改时间和时区进行了“测试”,epochspec.tv_sec 总是显示相同的结果,但是 CLOCK_REALTIME 的文档让我有些困惑,我不确定它们是否始终相同。
现实情况:我有一段代码使用了 time。现在我想要毫秒级的时间(可以从 spec.tv_nsec 中获取,乘以 1000000)。所以我考虑删除 time 并直接使用 clock_gettime,但我不确定在所有情况下是否仍然相同。
这个问题与 在 Linux 中测量时间 - time vs clock vs getrusage vs clock_gettime vs gettimeofday vs timespec_get?有些关联,但那里的信息对我来说不够。

在C++中还有第三个选项,即std::chrono::system_clock::now() - dreamlax
@dreamlax 是的,但是新标准不能用于我的情况,这就是为什么我明确要求这两个的原因。无论如何,还是谢谢 :) - Kiril Kirov
1个回答

9
注意:以下参考链接的git主分支和v4.7仅适用于x86,因为我很懒。
实际上time()是同名系统调用的别名,该系统调用调用get_seconds函数,位于kernel/time/time.c。该系统调用使用get_seconds函数返回UNIX时间戳,该函数从核心定时结构中读取,更准确地说是从“当前CLOCK_REALTIME秒数”字段(xtime_sec)中读取。 clock_gettime()是一个glibc函数,在sysdeps\unix\clock_gettime.c中,如果提供的时钟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维护,与上面的时间管理器结构相同。
简而言之:
答案是:是的,它们都从相同的时钟源获取时间。

“如果时钟是CLOCK_REALTIME,你是什么意思?” - Kiril Kirov
1
@KirilKirov clock_gettime的第一个参数是时钟ID。一个可能的值是提到的CLOCK_REALTIME - Koshinae
1
是的,我知道第一个参数,但我不明白你的意思。感谢澄清和编辑,现在我明白了。 - Kiril Kirov
@MaximEgorushkin 好的,这让我感到有些尴尬 :) - Koshinae
@KirilKirov clock_gettime 具有纳秒级分辨率。而 gettimeofday 仅具有微秒级分辨率,因此基于 gettimeofday 实现的 clock_gettime 并没有纳秒级分辨率。 - Maxim Egorushkin
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接