ADJTIMEX(2)

ИМЯ
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 определяет какие параметры, если это необходимо, устанавливаются. Значение поля может содержать комбинации (or) битовых масок, значения которых следующие:

#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 */
#define ADJ_TICK              0x4000 /* значение тика */
#define ADJ_OFFSET_SINGLESHOT 0x8001 /* old-fashioned adjtime() */

Обычные пользователи могут писать в mode только ноль. Только суперпользователь может задавать любые параметры.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
В случае успеха, 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.

СООТВЕТСТВИЕ СТАНДАРТАМ
adjtimex() — это специфичный для Linux системный вызов и он не должен использоваться в программах, которые должны быть переносимыми. Существует похожий, более переносимый, более гибкий метод настройки системных часов adjtime(3).

СМОТРИТЕ ТАКЖЕ
settimeofday(2), adjtime(3), capabilities(7), time(7)