table of contents
ADJTIMEX(2) | Руководство программиста Linux | 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).
СМОТРИТЕ ТАКЖЕ¶
2004-05-27 | Linux |