Системный вызов gettimeofday() возвращает календарное время в буфер, на который указывает значение аргумента tv.
#include <sys/time.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
Возвращает 0 при успешном завершении или –1 при ошибке
Аргумент tv является указателем на структуру следующего вида:
struct timeval {
time_t tv_sec; /* Количество секунд с 00:00:00, 1 янв 1970 UTC */
suseconds_t tv_usec; /* Дополнительные микросекунды (long int) */
};
Хотя для поля tv_usec предусмотрена микросекундная точность, конкретная точность возвращаемого в нем значения определяется реализацией, зависящей от архитектуры системы. (Буква «u» в tv_usec произошла от сходства с греческой буквой μ («мю»), используемой в метрической системе для обозначения одной миллионной доли.) В современных системах x86-32 (то есть в системах типа Pentium с регистром счетчика меток реального времени — Timestamp Counter, значение которого увеличивается на единицу с каждым тактовым циклом центрального процессора), вызов gettimeofday() предоставляет микросекундную точность.
Аргумент tz в вызове gettimeofday() является историческим артефактом. В более старых реализациях UNIX он использовался в целях извлечения для системы информации о часовом поясе (timezone). Сейчас этот аргумент уже вышел из употребления и в качестве его значения нужно всегда указывать NULL.
При предоставлении аргумента tz возвращается структура timezone, в чьих полях содержатся значения, указанные в устаревшем аргументе tz предшествующего вызова settimeofday(). Структура включает два поля: tz_minuteswest и tz_dsttime. Поле tz_minuteswest показывает количество минут, которое нужно добавить в этом часовом поясе (zone) для соответствия UTC; отрицательное значение показывает коррекцию в минутах по отношению к востоку от UTC (например, для ценральноевропейского времени это на один час больше, чем UTC, и поле будет содержать значение –60). Поле tz_dsttime содержит константу, придуманную для представления режима летнего времени — day-light saving time (DST), вводимого в этом часовом поясе. Дело в том, что режим летнего времени в устаревшем аргументе tz не может быть представлен с помощью простого алгоритма. (Это поле в Linux никогда не поддерживалось.) Подробности можно найти на странице руководства gettimeofday(2).
Системный вызов time() возвращает количество секунд, прошедших с начала отсчета времени (то есть точно такое же значение, которое возвращает gettimeofday() в поле tv_sec своего аргумента tv).
#include <time.h>
time_t time(time_t *timep);
Возвращает при успешном завершении количество секунд, прошедших с начала отсчета времени, или (time_t) –1 при ошибке
Если значение аргумента timep не равно NULL, количество секунд, прошедшее с начала отсчета времени, также помещается по адресу, который указывает timep.
Поскольку time() возвращает одно и то же значение двумя способами, и единственной возможной ошибкой, которая может произойти при использовании time(), является предоставление неверного адреса в аргументе timep (EFAULT), зачастую применяется такой вызов (без проверки на ошибку):
t = time(NULL);
Причина существования двух системных вызовов (time() и gettimeofday()) с практически одинаковым предназначением имеет исторические корни. В ранних реализациях UNIX предоставлялся системный вызов time(). В 4.2BSD добавился более точный системный вызов gettimeofday(). Существование time() в качестве системного вызова теперь считается избыточным; он может быть реализован в виде библиотечной функции, вызывающей gettimeofday().
На рис. 10.1 показаны функции, используемые для преобразования между значениями типа time_t и другими форматами времени, включая его представления для устройств вывода информации. Эти функции ограждают нас от сложностей, привносимых в такие преобразования часовыми поясами, режимами летнего времени и тонкостями локализации. (Часовые пояса будут рассмотрены в разделе 10.3, а вопросы локали — в разделе 10.4.)
Рис. 10.1. Функции для извлечения календарного времени и работы с ним
10.2.1. Преобразование значений типа time_t к виду, подходящему для устройств вывода информации
Функция ctime() предоставляет простой метод преобразования значения типа time_t к виду, подходящему для устройств вывода информации.
#include <time.h>