ИМЯ¶
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.
СМОТРИ
ТАКЖЕ¶
settimeofday(2)
ПЕРЕВОД¶
Перевёл с
английского
Виктор
Вислобоков
<corochoone@perm.ru> 2003