Документация по LinuxLinuxDoc.Ru 🔍

gettimeofday, settimeofday - определяет/устанавливает время

НАЗВАНИЕ
gettimeofday, settimeofday - определяет / устанавливает
время

СИНТАКСИС
#include

int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv , const struct
timezone *tz);

ОПИСАНИЕ
gettimeofday и settimeofday могут получать и устанавливать
время и часовой пояс. Аргумент tv является структурой
timeval и описанной в /usr/include/sys/time.h:

struct timeval {
long tv_sec; /* секунды */
long tv_usec; /* микросекунды */
};
и задающей количество секунд и микросекунд с начала эпохи
(см. time(2)).

Аргумент tz является timezone :

struct timezone {
int tz_minuteswest; /* количество минут коррекции по отношению к Гринвичу */
int tz_dsttime; /* тип сезонной коррекции времени */
};

Использование структуры timezone является устаревшим
методом: поле tz_dsttime никогда не использовалось в
Linux, оно не поддерживается и не будет поддерживаться
libc или glibc. Любое появление этого поля в исходных
версиях ядра (за исключением его описания) является
ошибкой. Поэтому все, что описано ниже, представляет
собой только исторический интерес. Поле tz_dsttime
содержит символьную постоянную (значения приведены ниже),
которая включает в себя информацию о сезонной коррекции
времени (Daylight Saving Time). (Замечание: эта величина
постоянна и указывает лишь на алгоритм коррекции.)
Алгоритмы сезонной коррекции определяются так :

DST_NONE /* без коррекции */
DST_USA /* коррекция для Америки */
DST_AUST /* коррекция для Австралии */
DST_WET /* коррекция для Западной Европы */
DST_MET /* коррекция для Центральной Европы */
DST_EET /* коррекция для Восточной Европы */
DST_CAN /* коррекция для Канады */
DST_GB /* Коррекция для Великобритании */
DST_RUM /* коррекция для Румынии */
DST_TUR /* коррекция для Турции */
DST_AUSTALT /* коррекция со сдвигом в 1986 для Австралии
*/

Разумеется, коррекцию для каждой страны нельзя описать
простым алгоритмом, так как этот фактор может зависеть
даже от непредсказуемых политических решений. Поэтому
этот метод представления часовых поясов больше не
используется. В Linux при вызове settimeofday поле
tz_dsttime должно содержать нулевое значение.

В Linux существует специфическое понятие `часовой сдвиг',
связанное с функцией settimeofday tz не равен NULL, а
параметр tv равен NULL, и значение поля tz_minuteswest не
равно нулю. В этом случае предполагается, что время
аппаратных часов (CMOS clock) местное и к ним дожен быть
добавлен этот параметр для того, чтобы получилось время
UTC. Но, как мы и говорили, использовать этот метод не
рекомендуется.

Для работы со структурой timeval существуют следующие
макросы:
((tvp)->tv_sec || (tvp)->tv_usec)
((tvp)->tv_sec cmp (uvp)->tv_sec ||\
(tvp)->tv_sec == (uvp)->tv_sec &&\
(tvp)->tv_usec cmp (uvp)->tv_usec)
((tvp)->tv_sec = (tvp)->tv_usec = 0)

Если tv или tz равно нулю, то соответствующая структура не
заполняется или не возвращается.

Только суперпользователь может работать с settimeofday.

ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ

gettimeofday и settimeofday при успешном завершении работы
возвращают ноль, и возвращают -1 при ошибках (в этом
случае errno присваиваются соответствующие значения).

КОДЫ ОШИБОК

EPERM settimeofday вызвана без прав суперпользователя.

EINVAL Неправильно указан часовой пояс (или какие-то
другие параметры).

EFAULT Или tv или tz указывают на недоступную область
адресного пространства.

ЗАМЕЧАНИЯ
Прототип settimeofday и определения для timercmp, timeris-
set, timerclear, timeradd, timersub доступны (с
glibc2.2.2) только если определно _BSD_SOURCE (либо явно,
либо неявно, неопределением _POSIX_SOURCE или сборкой с
флагом -ansi).

СООТВЕТСТВИЕ СТАНДАРТАМ
SVr4, BSD 4.3
Читать новости Linux в Telegram
Linux - gettimeofday, settimeofday - определяет/устанавливает время
Мы в соцсетях ✉