int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv
, const struct timezone *tz);
 
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 существуют следующие макросы:
#define timerisset(tvp)\
((tvp)->tv_sec || (tvp)->tv_usec) #define timercmp(tvp, uvp, cmp)\ ((tvp)->tv_sec cmp (uvp)->tv_sec ||\ (tvp)->tv_sec == (uvp)->tv_sec &&\ (tvp)->tv_usec cmp (uvp)->tv_usec) #define timerclear(tvp)\
((tvp)->tv_sec = (tvp)->tv_usec = 0)
Если tv или tz равно нулю, то соответствующая структура не заполняется или не возвращается.
Только суперпользователь может работать с settimeofday.
| Закладки на сайте Проследить за страницей | Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |