首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用adjtimex进行小时间调整

用adjtimex进行小时间调整
EN

Stack Overflow用户
提问于 2014-02-12 15:33:40
回答 1查看 4.1K关注 0票数 3

我有一个Linux系统,我需要对系统时间做一些小的定期调整,以跟踪外部时间源,但我希望避免日期/时间跳转。

我考虑使用adjtimex()内核函数(参见:adjtimex(2)adjtimex(8)),但是我有一些疑问:

  1. 偏置和单热模式到底有什么区别?
  2. 什么是可接受的参数范围?我问是因为:
    • adjtimex(8)提到,--offset的参数必须在-512000.512000范围内(因此它只能对+/- 0.5s进行更正),并且没有提到--singleshot的任何值
    • adjtimex(2)提到了一个范围-131071..+131071,它显然适用于两种模式。
    • 在我的测试中(使用adjtimex命令行实用程序),这些限制似乎都不适用。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-12 18:49:19

(请参阅Linux手册页项目中的Linux手册页。他们更有可能是最新的。注释表明实现的逻辑应该遵循RFC 1305)。)

有关实现细节,只需浏览Linux内核源代码即可。adjtimex()系统调用是在内核/时间c中定义的;查找SYSCALL_DEFINE.*(adjtimex,

adjtimex()本身调用在内核/时间/时间保持中定义的do_adjtimex()。基本范围检查是在ntp_validate_timex()中定义的内核/时间/ntp.c中完成的。

关于你的具体问题:

  1. 如果使用ADJ_OFFSET_SINGLESHOT,则adjtimex()表现为adjtime(),并且只能使用.offset字段。根据调整的大小和符号,NTP时钟被加速或减慢一段时间,直到达到所需的偏移;然后NTP时钟速率恢复到原来的状态。您不能与它一起使用任何其他模式标志。 ADJ_SETOFFSET.time添加到当前时间;立即将时钟向前移动。 ADJ_OFFSET还调整了NTP时钟速率,以在合理的时间内实现所需的偏移,因此效果应该与单击模式相同。但是,您也可以在同一个调用中使用其他ADJ_模式标志。 在Grodriguez的评论之后编辑: 只有在偏移量被认为是好的情况下,ADJ_OFFSET才有效果,即时钟状态是锁相的,STA_PLL。通常,如果采样间隔较长,或者NTP守护进程有一个错误的示例,NTP守护进程将将状态更改为频率锁定(STA_FLL)。 要使用ADJ_OFFSET,程序可能应该使用模式模式ADJ_OFFSET|ADJ_STATUS,并设置.status=STA_PLL。这将导致将当前时间设置为参考时间,以便相对于当前系统时间计算偏移量,并启用时钟偏移调整。
  2. 在内核源中,MAXPHASE常量(在包含/linux/timex.h中)定义偏移限制。目前,它以纳秒为单位,并指定了半秒钟;较大的值(在大小上)被悄悄地限制在半秒钟内,没有任何错误。 在2.6.26之前的中,极限较小(±131071)。新的限制是在2008年5月中添加的。 (这个限制的改变是传达给Linux手册维护人员,Michael,2009年6月,但是很明显adjtimex(2)手册页面从未被更新以反映这一变化。不过,我认为建议的措辞不够清楚。)
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21732321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档