Системный вызов time() и тип time_t представляют время в секундах в формате отсчета с начала Эпохи.
14.3.1. Время в микросекундах: gettimeofday()
Первой задачей является получение времени дня:
#include
int gettimeofday(struct timeval *tv, void *tz); /* определение POSIX, а не GLIBC */
gettimeofday() позволяет получить время дня.[156] В случае успеха возвращается 0, при ошибке -1. Аргументы следующие:
struct timeval *tv
Этот аргумент является указателем на struct timeval, которая вскоре будет описана и в которую система помещает текущее время.
void *tz
Это аргумент больше не используется; он имеет тип void*, поэтому он всегда должен равняться NULL. (Справочная страница описывает, для чего он использовался, а затем утверждает, что он устарел. Прочтите, если интересуетесь подробностями.)
Время представлено структурой struct timeval:
struct timeval {
long tv_sec; /* секунды */
long tv_usec; /* микросекунды */
};
Значение tv_sec представляет секунды с начала Эпохи; tv_usec является числом микросекунд в секунде.
Справочная страница GNU/Linux
#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)
Эти макросы работают со значениями struct timeval*; то есть указателями на структуры, и их использование должно быть очевидным из их названий и кода. Особенно интересен макрос timercmp(): третьим аргументом является оператор сравнения для указания вида сравнения. Например, рассмотрим определение того, является ли одна struct timeval меньше другой:
struct timeval t1, t2;
...
if (timercmp(&t1, & t2, <))
/* t1 меньше, чем t2 */
Макрос развертывается в
((&t1)->tv_sec < (&t2)->tv_sec || \
(&t1)->tv_sec == (&t2)->tv_sec && \
(&t1)->tv_usec < (&t2)->tv_usec)
Это значит: «если t1.tv_sec меньше, чем t2.tv_sec, ИЛИ если они равны и t1.tv_usec меньше, чем t2.tv_usec, тогда…».
14.3.2. Файловое время в микросекундах: utimes()
В разделе 5.5.3 «Изменение временных отметок: utime()» был описан системный вызов utime() для установки времени последнего обращения и изменения данного файла. Некоторые файловые системы хранят эти временные отметки с разрешением в микросекунды (или еще точнее). Такие системы предусматривают системный вызов utimes() (обратите внимание на завершающую s в названии) для установки времени обращения к файлу и его изменения с точностью до микросекунд:
#include
int utimes(char *filename, struct timeval tvp[2]);
Аргумент tvp должен указывать на массив из двух структур struct timeval, значения используются для времени доступа и изменения соответственно. Если tvp равен NULL, система использует текущее время дня.
POSIX обозначает ее как «традиционную» функцию, что означает, что она стандартизуется лишь для поддержки старого кода и не должна использоваться для новых приложений. Главная причина, пожалуй, в том, что нет определенного интерфейса для получения времени доступа и изменения файла в микросекундах; struct stat содержит лишь значения time_t, а не значения struct timeval.
Однако, как упоминалось в разделе 5.4.3 «Только Linux: указание файлового времени повышенной точности», Linux 2.6 (и более поздние версии) действительно предоставляет доступ к временным отметкам с разрешением в наносекунды при помощи функции stat(). Некоторые другие системы (такие, как Solaris) также это делают.[157] Таким образом, utimes() полезнее, чем кажется на первый взгляд, и несмотря на ее «традиционный» статус, нет причин не использовать ее в своих программах.