Книга: Разработка приложений в среде Linux. Второе издание
18.1.1. Представление времени
18.1.1. Представление времени
В системах Unix и Linux время отслеживается в секундах до или после начала эпохи, которое определяется как полночь 1 января 1970 года по UTC[148]. Положительные значения времени относятся к периоду после начала эпохи; отрицательные — до начала эпохи. Для того чтобы обеспечить работу процессов в режиме текущего времени, в Linux, как и во всех остальных версиях Unix, предусмотрен системный вызов time()
.
#include <time.h>
time_t time (time_t *t);
Функция time()
возвращает количество секунд, прошедших с момента начала эпохи. Если значение t
не является нулевым, то данная функция передает в эту переменную количество секунд, прошедших с начала эпохи.
Для решения некоторых проблем требуется более высокая разрешающая способность. В Linux предусмотрен еще один системный вызов — gettimeofday()
, который предоставляет более подробную информацию.
#include <sys/time.h>
#include <unistd.h>
int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval {
int tv_sec; /* секунды */
int tv_usec; /* микросекунды */
};
struct timezone {
int tz_minuteswest; /* минуты на запад от Гринвича */
int tz_dsttime; /* тип корректировки dst */
};
На большинстве платформ, включая i386, система Linux поддерживает возможность очень точного измерения времени. Стандартные персональные компьютеры содержат встроенные часы, которые обеспечивают информацию о текущем времени с точностью до микросекунд. Оборудование Alpha и SPARC также предлагает высокоточный таймер. На некоторых других платформах система Linux может отслеживать время только в пределах разрешающей способности системного таймера, который в общем случае устанавливается на значение 100 Гц. В связи с этим член tv_usec
структуры timeval
в подобных системах может иметь меньшую точность.
В sys/time.h
определены пять макросов для обработки структур timeval
.
timerclear(struct timeval *)
Данный макрос очищает структуру timeval
.
timerisset(struct timeval *)
Данный макрос проверяет структуру timeval
на заполнение (другими словами, отличен ли хотя бы один элемент от нуля).
timercmp(struct timeval *t0, struct timeval *t1, operator)
Данный макрос позволяет сравнивать две структуры timeval
в одном временном интервале. Он вычисляется в логический эквивалент t0 операция t1
, если t0
и t1
относятся к арифметическим типам. Обратите внимание на то, что макрос timercmp()
не работает для операций <=
и >=
. Вместо этого нужно применять формы !timercmp(t1, t2, >)
и !timercmp(t1, t2, <)
.
timeradd(struct timeval *t0, struct timeval *t1, struct timeval *result)
Добавляет t0
к t1
и размещает сумму в переменной result
.
timersub(struct timeval *t0, struct timeval *t1, struct timeval *result)
Вычитает t1
из t0
и передает разность в переменную result
.
Третье представление времени struct tm
дает время в исчислении, более привычном для человека.
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
long int tm_gmtoff;
const char *tm_zone;
};
Первые девять элементов являются стандартными, последние два — нестандартные, однако очень полезные (они существуют в системах Linux).
tm_sec |
Количество прошедших секунд в минуте. Принимает значения от 0 до 61 (две дополнительные секунды выделяются для учета лишних секунд, относящихся к високосному году). |
tm_min |
Количество прошедших минут в часе. Принимает значения от 0 до 59. |
tm_hour |
Количество прошедших часов в сутках. Принимает значения от 0 до 23. |
tm_mday |
Номер дня месяца. Принимает значения от 1 до 31. Это единственный элемент, который не может равняться нулю. |
tm_mon |
Количество прошедших месяцев в году. Принимает значения от 0 до 11. |
tm_year |
Количество прошедших лет (считая с 1900 года). |
tm_wday |
Количество прошедших дней в неделе (считая от воскресенья). Принимает значения от 0 до 6. |
tm_yday |
Количество прошедших дней в году. Принимает значения от 0 до 365. |
tm_isdst |
Определяет, поддерживается ли летнее время в текущем часовом поясе, tm_isdst принимает положительное значение, если время переведено на летнее, 0 — если не переведено, 1 — если система не может это определить. |
tm_gmtoff |
Параметр не является переносимым, поскольку он используется не во всех системах. Если он существует, то он может также называться __tm_gmtoff . Данная переменная указывает число секунд к востоку от UTC или отрицательное число секунд к западу от UTC для часовых поясов к востоку от линии перемены дат. |
tm_zone |
Параметр не является переносимым, поскольку он используется не во всех системах. Если он существует, то он может также называться __tm_zone . Он содержит название текущего часового пояса (некоторые часовые пояса могут иметь несколько имен). |
В завершение, стандарт POSIX.1b обработки данных в режиме реального времени поддерживает даже большую разрешающую способность, чем доступные в стандарте struct timeval
микросекунды. В структуре struct timespec
используются наносекунды, а также выделено больше пространства для размещения чисел.
struct timespec {
long int tv_sec; /* секунды */
long int tv_nsec; /* наносекунды */
};
- B10. Функции даты и времени: ‹time.h›
- Представление дискуссионной группы по управлению проектами
- 6.1.3.2. Сложное форматирование времени: strftime()
- Внутреннее представление переменной jiffies
- 18.1. Вывод времени и даты
- Уменьшение времени, необходимого для резервного копирования и восстановления
- Ограничение времени ожидания для транзакций (Lock timeout)
- 7.12. Объективизация времени
- Квант времени
- 4.2. Формализованное представление угроз ИБ от персонала
- Формула времени. Тайм-менеджмент на Outlook 2013
- 5 Текстовое представление данных: ясные протоколы лежат в основе хорошей практики