Linux使用David L. Mills的時鐘調整演算法(參見RFC 1305)。系統呼叫adjtimex() 讀取並可選地設定此演算法的調整引數。它接收指向timex 結構體的指標,根據欄位值更新核心引數,並返回包含當前核心值的相同結構體。此結構體宣告如下:
struct timex {
int modes; /* mode selector */
long offset; /* time offset (usec) */
long freq; /* frequency offset (scaled ppm) */
long maxerror; /* maximum error (usec) */
long esterror; /* estimated error (usec) */
int status; /* clock command/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; /* usecs between clock ticks */
};
modes欄位確定要設定哪些引數(如果有)。它可以包含以下位的按位或組合:
#define ADJ_OFFSET 0x0001 /* time offset */
#define ADJ_FREQUENCY 0x0002 /* frequency offset */
#define ADJ_MAXERROR 0x0004 /* maximum time error */
#define ADJ_ESTERROR 0x0008 /* estimated time error */
#define ADJ_STATUS 0x0010 /* clock status */
#define ADJ_TIMECONST 0x0020 /* pll time constant */
#define ADJ_TICK 0x4000 /* tick value */
#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime() */
普通使用者被限制為mode 的零值。只有超級使用者可以設定任何引數。
返回值
成功時,adjtimex() 返回時鐘狀態。
#define TIME_OK 0 /* clock synchronized */
#define TIME_INS 1 /* insert leap second */
#define TIME_DEL 2 /* delete leap second */
#define TIME_OOP 3 /* leap second in progress */
#define TIME_WAIT 4 /* leap second has occurred */
#define TIME_BAD 5 /* clock not synchronized */