我的情况很奇怪,我需要一些指导来调整 NTP 时间。
我有一台运行 NTP 守护程序的 PC(Red Hat),这台 PC 使用我 LAN 上的 Stratum 2 时间服务器调整其时间。
我的 PC 还通过串行端口 (RS-232) 连接到 DVR。这个设备和我的电脑时间需要同步。
但是一段时间后,我的 PC 和 DVR 的时钟开始漂移,所以我需要一种方法来检测我的 PC 上的时间调整,并将相同的调整应用到 DVR。
有什么办法吗?
我希望找到一种在操作系统级别订阅某种事件的方法,以便在 Red Hat 上更改系统时钟。 (如果这对 RedHat 来说是可能的)
在 Windows 上似乎可以使用 SystemEvents.TimeChanged事件,但我在 RedHat 上找不到使用 C++ 的对应项。
感谢任何帮助。
最佳答案
大部分时间 NTP 服务器不会对系统时钟进行离散调整,它只是使用 adjtime
减慢或加快它,以努力控制漂移率。 NTP 服务器可能会相当连续地执行此操作,并且不会在每次进行调整时都告诉您。
即使 NTP 服务器在进行调整时告诉您,该信息对您也无用。 DVR 的时钟由不同的硬件驱动,因此具有不同的漂移率,需要在不同的时间进行不同的调整。理想情况下,这将由 DVR 上的 NTP 守护进程完成!
NTP 守护程序在某些 情况下会导致时钟跳变。它可能发生在启动时或时钟走时,但这应该是非常罕见的事件。它在执行此操作时可能会发出一条日志消息,因此一种可能性是查看日志。另一种可能性是不时比较 clock_gettime(CLOCK_REALTIME)
和 clock_gettime(CLOCK_MONOTONIC)
的结果。当您注意到这两个时钟之间的增量发生了变化时,一定是因为有人让系统时间发生了跳跃。但请注意:结果会很紧张,因为从您获取其中一个时钟的那一刻到获取另一个时钟的那一刻,经过了不可预测且可变的时间。
根据您的需要,您可以通过忽略系统时间并仅使用 clock_gettime(CLOCK_MONOTONIC)
与 DVR 同步来实现您的需要。那个时钟保证不会跳。但要小心! (又一次?!哈哈!)我相信 CLOCK_MONOTONIC
在 NTP 守护进程的指导下可能仍然会减速和加速。
关于time - 获取有关 ntp 调整的通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7497242/