在我的Ubuntu15.04(LinuxKernel3.19.0-28-Generic)上,我在使用CLOCK_TAI和CLOCK_REALTIME请求clock_gettime()时得到了相同的值。这显然是一个错误,因为CLOCK_TAI和CLOCK_REALTIME之间的区别应该是闰秒的数量加上考虑到这篇文章关于RedHat操作系统的时代性差异。
发布于 2015-09-18 15:08:18
CLOCK_TAI is basically designed as CLOCK_REALTIME(UTC) + tai_offset. 因此,时间/时间的usec/nsec部分应该是相同的。
CLOCK_MONOTONIC: Zeroed at boot.
CLOCK_TAI = CLOCK_MONOTONIC + tai_mon_offset
CLOCK_REALTIME(UTC) = CLOCK_TAI - tai_utc_offset 但是由于性能方面的考虑(CLOCK_REALTIME是应用程序中最看重的),在Linux中,我们实际上将其结构为:
CLOCK_REALTIME: Initialized at boot from RTC
CLOCK_MONOTONIC: CLOCK_REALTIME - wall_to_monotonic
CLOCK_TAI: CLOCK_REALTIME + tai_offset所以CLOCK_REALTIME and CLOCK_TAI return the same because the kernel parameter tai_offset is zero.
使用adjtimex(timex tmx)进行检查并读取值。我认为,如果ntpd是足够新的(>4.2.6)并且有一个闰秒文件,它就会设置它。它也可以从上游服务器获得它,但我还无法验证。调用adjtimex()可以在以根用户身份运行时手动设置tai_offset。
我的参考资料这里和这里
发布于 2015-09-18 14:57:47
答案在所提到的文章中找到。重点是我。
对于可以使用TAI时间而不是UTC的应用程序,内核提供了一个特殊的CLOCK_TAI时钟,其中确实包含了闰秒,并且不需要在闰秒之后进行校正,从而完全避免了时间上的反向跳转问题。它被实现为一个时钟,运行在一个固定的积分偏移量到CLOCK_REALTIME,当CLOCK_REALTIME时钟在闰秒上向后退时,该时钟原子地递增1。它是在LinuxVersion3.10中引入的,可以在RHEL7中提供的内核中使用。请注意,CLOCK_REALTIME的偏移量是在启动时初始化为零的,无论是ntpd还是the,默认情况下都不会将其设置为正确的值(当前为35)。当然,在应用程序中切换到CLOCK_TAI需要修改代码,也可能需要修改所有使用Unix表示时间的协议。
https://askubuntu.com/questions/675622
复制相似问题