adjtimex(adjtimex)

发布时间:2025-12-10 19:32:23 浏览次数:11

adjtimex-adjtimex()

adjtimex一、介绍   linux系统有两个时钟:一个是由主板电池驱动的“RealTimeClock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是“Systemclock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核

一、介绍

linux系统有两个时钟:一个是由主板电池驱动的“Real Time Clock”也叫做RTC或者叫CMOS时钟,硬件时钟。当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的。另一个时间是 “System clock”也叫内核时钟或者软件时钟,是由软件根据时间中断来进行计数的,内核时钟在系统关机的情况下是不存在的,所以,当操作系统启动的时候,内核时钟是要读取RTC时间来进行时间同步(有些情况下,内核时钟也可以通过ntp服务器来读取时间) 这两个时钟通常会有一些误差,所以长时间可以导致这两个时钟偏离的比较多,最简单的保持两个时间同步的方法是用软件测出他们之间的误差率,然后用软件进行修正。在每次重新启动系统的时候,系统都会用hwclock命令对时间进行同步。如果内核时钟在每一个时间中断都快或者慢的话,可以用adjtimex命令进行调整,使得RTC和内核时间走的快慢一致。adjtimex允许用户来调整内核的时间参数,因此可以改变内核时间的速度,可以用hwclock命令来比较出内核时间和RTC时间的偏移率,然后利用adjtimex命令根据偏移率来对内核时间进行校正,使得内核时间走的快些或者慢些,当经过调整的内核时间跟RTC时间走的同样快的时候,可以把这个命令行写到启动脚本里面,让每次机器启动的时候都可以把内核的时间参数调整正确。

二、adjtimex 命令使用说明

语法:adjtimex[OPTION]… 主要参数说明:

-p, –print 输出内核时间变量的值 -t, –tick val 设置内核时钟计数间隔(微秒) -f, –frequency newfreq 设置系统时钟偏移量 -c, –compare[=count] 比较系统时钟和CMOS时钟 -i, –interval tim 设置时钟比较间隔时间 (sec) -l, –log[=file] 将当前时间记录到文件中 –host timeserver 查询时间服务器 -u, –utc 将CMOS时钟设置成UTC 三、 adjtimex应用

查看当前内核时间变量的信息

# adjtimex -p       mode: 0     offset: 0  frequency: 573135   maxerror: 16384000   esterror: 16384000     status: 65time_constant: 6  precision: 1  tolerance: 33554432       tick: 10000   raw time:  1189736934s 800946us = 1189736934.800946

是否还在为Ide开发工具频繁失效而烦恼,来吧关注以下公众号获取最新激活方式。亲测可用!

为防止网络爬虫,请关注公众号回复”口令”

激活idea 激活CLion DataGrip DataSpell dotCover dotMemory dotTrace GoLand PhpStorm PyCharm ReSharper ReShaC++ Rider RubyMine WebStorm 全家桶 刷新

【正版授权,激活自己账号】:Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】:官方授权 正版激活 自己使用,支持Jetbrains家族下所有IDE…

return value = 5

比较系统时钟和CMOS时钟的误差

# adjtimex --compare                                         --- current ---    -- suggested --cmos time     system-cmos       2nd diff    tick      freq     tick      freq1191706436  -1969378.503326 -1969378.503326  10000    5731351191706446  -1969378.503351      -0.000026   10000    5731351191706456  -1969378.503359      -0.000007   10000    573135    10000    6199521191706466  -1969378.503403      -0.000045   10000    573135    10000    8668251191706476  -1969378.503406      -0.000003   10000    573135    10000    5918251191706486  -1969378.503454      -0.000048   10000    573135    10000    8871401191706496  -1969378.503449       0.000005   10000    573135    10000    5402651191706506  -1969378.503510      -0.000061   10000    573135    10000    973075

2nd diff表示系统时间在10秒周期内快了还是慢了几秒种,如“-0.000026”在这里表示系统时间在10秒钟内慢了0.000026秒(注意,这里系统会连续测试出好几个连续的差别,一般可以参考平均值)。 前面的tick/freq字段表示内核的tick和freq值,后面的tick/freq表示系统对tick和freq的推荐值,用这个值可以对系统时间进行校正。针对上面的误差可以不需要校正,若需要修正可使用adjtimex–t或adjtimex–f指令进行修正。

修正系统时间和CMOS时间之间的误差:

# adjtimex –t 10002

把系统10秒(10000微秒)的长度定义成实际时间的10002微秒,也就是说让系统时间走的快点,也可以说每系统时间走10秒(10000微秒)就快2微秒,从而系统时间跟上了RTC时间,达到了时间校正的目的。

四、 系统代码实现说明

头文件 :

#include <sys/timex.h>

函数原型:

int adjtimex(struct timex *buf);

函数说明:

Linux 使用 David L. Mill 的时钟调整算法系统调用adjtimex() 读取和可选地设置该算法的调整参数。它以一个指向结构体timex指针为参数,更新内核参数相应的值,并且通过相同的结构体来返回内核当前的值。这个结构体被声明为如下:

struct timex { int modes; /* 模式选择符 */ long offset; /* 时间偏移 (微秒) */ long freq; /* 频率偏移 (由 ppm 缩放) */ long maxerror; /* 最大错误 (微秒) */ long esterror; /* 估计的错误 (微秒) */ int status; /* 时钟 命令/状态 */ long constant; /* pll time constant */ long precision; /* clock precision (usec) (read-only) */ long tolerance; /* clock frequency tolerance (ppm) (read-only) */ struct timeval time; /* current time (read-only) */ long tick; /* 时钟滴答之间的微秒 */ }; modes 域用来指定哪个参数用于设置,如果需要的话。它可能包含下面值的位-或的组合: #define ADJ_OFFSET 0x0001 /* 时间利偏移 */ #define ADJ_FREQUENCY 0x0002 /* 频率偏移 */ #define ADJ_MAXERROR 0x0004 /* 最大 错误值*/ #define ADJ_ESTERROR 0x0008 /* 估计的 错误值*/ #define ADJ_STATUS 0x0010 /* 时钟状态 */ #define ADJ_TIMECONST 0x0020 /* pll time constant */ #define ADJ_TICK 0x4000 /* 时钟滴答值 */ #define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime() */ 一般用户严格要求把 mode 的值设置为零,只有 超级用户可以设置某些参数。 注意:adjtimex() 是 Linux 定义并不应该出现在可移植的程序里。参看 adjtime(3) 来获得更好移植性,但却缺少灵活性的调整 系统时钟的方法。

返回值

成功时,adjtimex() 返回时钟状态: #define TIME_OK 0 /* 时钟已同步 */ #define TIME_INS 1 /* 插入调整值 */ #define TIME_DEL 2 /* 删除调整值 */ #define TIME_OOP 3 /* 调整正进行 */ #define TIME_WAIT 4 /* 调整已经发生 */ #define TIME_BAD 5 /* 时钟没有同步 */ 失败时,adjtimex() 返回 -1 并把 errno 设置为合适的值。

错误

EFAULT buf 没有指向一个可写的内存。 EINVAL 试图设置,但是 buf.offset 超过从 -131071 到 +131071 范围,或者 buf.status 不是上面列出的值,或者 buf.tick 值超出从 900000/HZ 到 1100000/HZ,此处的 HZ 是系统时钟中断频率。 EPERM buf.mode 不是零但调用者没有足够的权限。在 Linux 下至少需要要 CAP_SYS_TIME 权限。
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477