Книга: Linux программирование в примерах

14.3.1. Время в микросекундах: gettimeofday()

14.3.1. Время в микросекундах: gettimeofday()

Первой задачей является получение времени дня:

#include <sys/time.h>
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 gettimeofday(2) документирует также следующие макросы:

#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, тогда…».

Оглавление книги


Генерация: 1.631. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз