gpt4 book ai didi

linux - ntp_gettime() 实际上返回纳秒精度吗?

转载 作者:IT王子 更新时间:2023-10-29 01:15:59 26 4
gpt4 key购买 nike

Ubuntu 12.04 LTS 上的以下代码:

 #include <stdio.h>
#include <sys/timex.h>
#include <sys/time.h>

int main(int argc, char **argv)
{
struct timeval tv;
gettimeofday(&tv, NULL);

struct ntptimeval ntptv;
ntp_gettime(&ntptv);

printf("gettimeofday: tv_sec = %ld, tv_usec = %ld\n",
tv.tv_sec, tv.tv_usec);
printf("ntp_gettime: tv_sec = %ld, tv_usec = %ld\n",
ntptv.time.tv_sec, ntptv.time.tv_usec);
}

返回:

 gettimeofday: tv_sec = 1366209548, tv_usec = 137736
ntp_gettime: tv_sec = 1366209548, tv_usec = 137743081

这有点奇怪,因为 tv_usec 值,如果它确实是微秒计数,不应大于 1000000。上面显示的结果让我认为 ntp_gettime() 实际上返回纳秒精度。

ntp_gettime() 联机帮助页(精确)位于 http://manpages.ubuntu.com/manpages/precise/man2/ntp_gettime.2freebsd.html真的没什么好说的。

较早的联机帮助页版本(适用于 hardy) http://manpages.ubuntu.com/manpages/hardy/man2/ntp_gettime.2.html声称它可能是纳秒或微秒,具体取决于 ntp_adjtime() 返回的 status 字中是否设置了 STA_NANO 位。

有谁知道吗?除此之外,ntp_gettime()ntp_adjtime() 以及它们调用的所有各种内部函数在 12.04 源代码中定义在哪里?

最佳答案

ntp_gettimentp_adjtime 都在 C 库中定义。在 Linux 和 glibc 上,ntp_adjtime 只是 adjtimex 系统调用的包装器,而 ntp_gettime 通过将 传递给它来使用相同的系统调用将 modes 设置为 0 的 struct timex。您可以在 the glibc LXR 浏览它们的定义。 .

系统调用implementation电话 _do_adjtimex这叫getnstimeofday获取时间(以纳秒为单位),然后将其交给 __do_adjtimex .这是有趣的部分:

txc->time.tv_sec = ts->tv_sec;
txc->time.tv_usec = ts->tv_nsec;
if (!(time_status & STA_NANO))
txc->time.tv_usec /= NSEC_PER_USEC;

因此,如果设置了 STA_NANO,它只会将纳秒值放入 tv_usec,这是您遇到的行为。如果你想取消设置这个标志,你可以这样做:

struct timex tmx;
tmx.modes = 0 | ADJ_MICRO;
ntp_adjtime(&tmx);

然后从 tmx.time.tv_usec 中读取您的微秒值。如果你想这样做,你必须使用 sudo 运行你的代码,但要注意该标志将在内核中保持未设置,直到你重置它(使用 ADJ_NANO)或重启。

关于linux - ntp_gettime() 实际上返回纳秒精度吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16063408/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com