ИМЯ
adjtimex − тонкая настройка часов в ядре
ОБЗОР
#include <sys/timex.h>
int adjtimex(struct timex *buf);
ОПИСАНИЕ
Linux использует для подстройки часов алгоритм David L. Mills (см. RFC 1305). Системный вызов adjtimex читает и (необязательно) устанавливает параметры подстройки для этого алгоритма. В качестве аргумента используется указатель на структуру timex , по значениям в полях которой осуществяется обновление параметров ядра и в этой же структуре происходит возврат текущих значений параметров ядра. Данная структура описана так:
struct timex {
int modes; /* выбор
режима */
long offset; /*
смещение
по
времени (usec) */
long freq; /*
частота
смещения
(scaled ppm) */
long maxerror; /*
максимальная
ошибка (usec) */
long esterror; /*
ожидаемая
ошибка (usec) */
int status; /*
команда/состояние
для часов */
long constant; /*
временная
константа
pll */
long precision; /*
точность
часов (usec)
(только
чтение) */
long tolerance; /* clock frequency tolerance (ppm)
(read only) */
struct timeval time; /*
текущее
время
(только
чтение) */
long tick; /* usecs between clock ticks */
};
Поле modes определяет какие параметры, если это необходимо, устанавливаются. Значение поля может содержать комбинации битовых масок, значения которых следующие:
#define
ADJ_OFFSET 0x0001 /*
смещение
времениtime offset
*/
#define ADJ_FREQUENCY 0x0002 /*
частота
смещения */
#define ADJ_MAXERROR 0x0004 /*
максимальная
ошибка
времени */
#define ADJ_ESTERROR 0x0008 /*
ожидаемая
ошибка
времени */
#define ADJ_STATUS 0x0010 /*
состояние
часов */
#define ADJ_TIMECONST 0x0020 /*
временная
константа
pll */
#define ADJ_TICK 0x4000 /*
значение
тика */
#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned
adjtime */
Обычные пользователи могут писать в mode. только ноль. Только суперпользователь root может устанавливать любые параметры.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха, 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 не является указателем на доступную для записи область памяти. | ||
EPERM |
buf.mode не ноль, а пользователь не является суперпользователем. | ||
EINVAL |
Попытка установить buf.offset в значение, выходящее за диапазон от −131071 до +131071, или установить buf.status в значение отличное от перечисленных выше, или установить buf.tick в значение за пределами диапазона от 900000/HZ до 1100000/HZ, где HZ − это частота прерываний системного таймера. |
СОВМЕСТИМОСТЬ СО СТАНДАРТАМИ
adjtimex − это специфичный для Linux вызов и он не должен использоваться в программах, которые пишуться как переносимые. Существует похожий, но более общий для разных Unix систем вызов adjtime в SVr4.
СМОТРИ ТАКЖЕ
ПЕРЕВОД
Перевёл с английского Виктор Вислобоков <corochoone [AT] perm.ru> 2003