为什么 CLOCK_TAI 和 CLOCK_REALTIME 返回相同的值?

chm*_*ike 3 time c 15.04

在我的 Ubuntu 15.04\xc2\xa0(Linux Kernel 3.19.0-28-generic) 上,我在请求CLOCK_TAICLOCK_REALTIME使用clock_gettime(). 这显然是一个错误,因为考虑到这篇关于 RedHat 操作系统的 文章CLOCK_TAI,\xc2\xa0and之间的差异CLOCK_REALTIME应该是闰秒数加上纪元差异。

\n

Rav*_*van 5

CLOCK_TAI is basically designed as CLOCK_REALTIME(UTC) + tai_offset.  
Run Code Online (Sandbox Code Playgroud)

因此 timeval/timespec 的 usec/nsec 部分应该相同。

CLOCK_MONOTONIC: Zeroed at boot.  

CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset    

CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset  
Run Code Online (Sandbox Code Playgroud)

但出于性能考虑(CLOCK_REALTIME 是应用程序最常使用的),在 Linux 中我们实际上将其结构为:

CLOCK_REALTIME: Initialized at boot from RTC  
CLOCK_MONOTONIC: CLOCK_REALTIME - wall_to_monotonic  
CLOCK_TAI: CLOCK_REALTIME + tai_offset
Run Code Online (Sandbox Code Playgroud)

所以CLOCK_REALTIME and CLOCK_TAI return the same because the kernel parameter tai_offset is zero.

使用adjtimex(timex tmx)并读取值进行检查。我认为ntpd如果它足够新(>4.2.6)并且有闰秒文件,就会设置它。它也可能能够从上游服务器获取它,但我无法验证。adjtimex()当以 root 身份运行时,可以手动设置该调用tai_offset

我的参考文献在这里这里