adjtimex是一个计算机算法。Linux 使用 David L. Mill 的时钟调整算法系统调用 adjtimex() 读取和可选地设置该算法的调整参数。
头文件#include
函数原型int adjtimex(struct timex *buf);
说明Linux 以一个指向结构体 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 (5月份有什么节日?5月份的节日包括:劳动节、青年节、日本儿童节、母亲节、德国父亲节等重大的节日。)/* 调整已经发生 */
#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 权限。
adjtimex相关的文章巴比伦天文学(巴比伦天文学)
标签:adjtimex,飞外