CLOCK_TAI的时代是什么?

chm*_*ike 4 c linux time posix tai-time

从Linux内核版本3.10开始,该函数clock_gettime()现在可以接受CLOCK_TAI

我没有找到该时钟的详细描述。它的时代是什么?

编辑1:刚比较了我的Linux 3.19 OS上CLOCK_REALTIME和CLOCK_TAI的输出,它返回的值完全相同(1442582497)!CLOCK_REALTIME是否在leap秒减少?

编辑2:根据本文,CLOCK_TAI与(错误命名的)CLOCK_REALTIME之间的差应为of秒数。

编辑3:原因CLOCK_TAICLOCK_REALTIME时间相同,请参阅编辑2中引用的文章。重点在于我。

对于可能使用TAI时间而不是UTC的应用程序,内核提供了一个特殊的CLOCK_TAI时钟,该时钟确实包含seconds秒,并且不需要在leap秒后进行校正,从而完全避免了时间向后跳的问题。它被实现为以与CLOCK_REALTIME固定的整数偏移量运行的时钟,当CLOCK_REALTIME时钟退回到leap秒时,原子偏移量自动增加1。它是在Linux内核版本3.10中引入的,并且随RHEL7附带的内核一起提供。请注意,与CLOCK_REALTIME的偏移量在引导时初始化为零,并且ntpd和chronyd均未将其默认设置为正确值(当前为35)。 在应用程序中切换到CLOCK_TAI当然需要修改代码,也可能需要修改所有使用Unix时间表示的协议。

编辑4:在Ask Ubuntu上获得的答案阐明了所有内容。

小智 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)并且具有second秒文件,它将对其进行设置。它也可能能够从上游服务器获取它,但我无法进行验证。以root身份运行时,adjtimex()可以tai_offset手动设置该呼叫。

在这里这里的参考