_time_ Работа с астрономическим временем. Отсчёт интервалов времени. (Мини-учебник с ejudge = Чернокнижка)
Описание файла
Файл "_time_ Работа с астрономическим временем. Отсчёт интервалов времени." внутри архива находится в папке "Мини-учебник с ejudge = Чернокнижка". PDF-файл из архива "Мини-учебник с ejudge = Чернокнижка", который расположен в категории "". Всё это находится в предмете "практика расчётов на пэвм" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст из PDF
1Работа с календарным временем и интервалами времениВ данном разделе рассматриваются функции работы с календарным временем и интервалами времени в операционных системах, удовлетворяющих стандарту POSIX.1.1 Работа с календарным временем (ANSI C)Типы данныхКалендарное время включает в себя год, месяц, день месяца и текущее время суток.
Дляхранения календарного времени используется тип time_t. В POSIX-системах календарноевремя хранится как количество секунд, прошедшее от «начала эпохи», причём для простотысчитается, что каждый 4-й год всегда високосный. Эпоха началась (для UNIX) в полночь 1января 1970 г. по Гринвичу. Время отсчитывается по часовому поясу Гринвичского меридианабез перехода на летнее время (так называемое «Универсальное координированное время»UTC — Coordinated Universal Time).В настоящее время в POSIX-системах тип time_t эквивалентен типу long.
Диапазоназначений типа long (32 бита) достаточно для представления дат, лежащих в отрезке длинойпримерно 136 лет. Поскольку отрицательные числа используются для представления дат до1970 года, переполнение текущего представления типа time_t может произойти в 2038 году,если, конечно, до этого момента представление не будет изменено.Для более удобного представления календарного времени используется тип struct tm,определённый следующим образом.struct tm{intintintintintintintintint};tm_sec;tm_min;tm_hour;tm_mday;tm_mon;tm_year;tm_wday;tm_yday;tm_isdst;/*/*/*/*/*/*/*/*/*секунды [0-60] */минуты [0-59] */час [0-23] */день месяца [1-31] */месяц [0-11], 0 = январь */число лет от 1900 г */день недели [0-6], 0 = воскр.
*/день года [0-365] */летнее время */Поле tm_sec обычно хранит значения в интервале от 0 до 59, но может хранить и 60, когдадля коррекции времени в календарь вставляется дополнительная секунда.Поле tm_year хранит год, отсчитываемый от 1900 года, то есть, например, значение 100в поле tm_year означает 2000 год.Поле tm_wday хранит день недели, отсчитываемый от воскресенья (значение 0) и до субботы (значение 6).Поле tm_isdst хранит информацию о том, действует ли в описываемый момент летнее время. Этот флаг больше нуля, если летнее время действует, нуль, если летнее время недействует, и отрицателен, если информация о действии летнего времени отсутствует.Оба описанных выше типа определены в заголовочном файле <time.h>, определённомстандартом ANSI C, то есть должны присутствовать в любой достаточно современной систе1ме программирования на Си. Стандарт ANSI не определяет внутреннее представление длятипа time_t.ФункцииВ стандарте ANSI C также определяется набор функций для манипулирования с календарным временем.
Прототипы этих функций определены в заголовочном файле <time.h>.Функция time позволяет получить текущее системное календарное время. Функция имеет следующий прототип:time_t time(time_t *pval);Функция возвращает текущее календарное время. Кроме того, если указатель pval ненулевой, функция записывает текущее время по указанному адресу.Функции localtime, gmtime преобразовывают дату из секундного представленияtime_t в структурное представление struct tm. Они имеют следующие прототипы:struct tm *gmtime(const time_t *timep);struct tm *localtime(const time_t *timep);extern char *tzname[2];long int timezone;Функция gmtime конвертирует календарное время timep в развёрнутое структурное представление, выражающее универсальное координированное время (UTC), т.
е. время Гринвичского меридиана без перехода на летнее время. Функция возвращает указатель на статическую область памяти, которая переписывается при каждом вызове функций работы с календарным временем. Поэтому при необходимости эту структуру нужно скопировать в другоеместо.Функция localtime конвертирует календарное время timep в развёрнутое структурное представление в определённом пользователем или системой часовом поясе. Функцияустанавливает переменную tzname в имя текущего часового пояса (tzname[0] — имя часового пояса зимнего времени, tzname[1] — имя часового пояса летнего времени), переменную timezone в разницу в секундах между поясным временем и универсальным координированным временем (UTC).
Функция возвращает указатель на статическую областьпамяти, которая переписывается при каждом вызове функций работы с календарным временем. Поэтому при необходимости эту структуру нужно скопировать в другое место.Функция mktime конвертирует календарное время местного часового пояса в развёрнутом структурном формате в секундное представление. Функция имеет следующий прототип:time_t mktime(struct tm *timeptr);Функция игнорирует содержимое полей tm_wday, tm_yday, tm_isdst и перевычисляетих, используя оставшиеся поля структуры.
Если значение какого-либо поля структуры находится за пределами допустимых значений, оно нормализуется, например, 40 октября становится 9 ноября. Вызов mktime заполняет переменную tzname информацией о местномчасовом поясе. Если заданное структурное представление не может быть преобразовано впосекундное представление, функция возвращает значение (time_t)(-1) и не изменяетзначения полей tm_wday и tm_yday.Функции ctime и asctime конвертируют календарное время в символьную строку.
Ониимеют следующие прототипы:2char *asctime(const struct tm *timeptr);char *ctime(const time_t *timep);Функция ctime преобразует календарное время timep в строку вида"Tue Nov7 11:32:11 2000\n"Дни недели сокращаются до ‘Sun’, ‘Mon’, ‘Tue’, ‘Wed’, ‘Thu’, ‘Fri’, ‘Sat’. Имя месяца сокращается до ‘Jan’, ‘Feb’, ‘Mar’, ‘Apr’, ‘May’, ‘Jun’, ‘Jul’, ‘Aug’, ‘Sep’, ‘Oct’, ‘Nov’, ‘Dec’.
Возвращаемое значение указывает на статическую область памяти, которая переписывается привызовах функций ctime и asctime. Функция заполняет переменную tzname информацией о местном часовом поясе.Функция asctime преобразовывает развёрнутое структурное представление timeptrв строку того же самого формата, что функция ctime. Возвращаемое значение указывает на статическую область памяти, которая переписывается при вызовах функций ctime иasctime. Функция заполняет переменную tzname информацией о местном часовом поясе.Функция strftime позволяет получать строковое представление времени согласно заданной форматной строке. Прототип следующий:size_t strftime(char *s, size_t max, const char *format,const struct tm *tm);Функция форматирует время в развёрнутом структурном представлении tm в соответствиисо спецификацией формата format и помещает результат в символьный массив s размераmax.Обычные символы копируются из форматной строки в строку s без преобразования.Спецификаторы формата начинаются со знака ’%’ и приведены в таблице.Функция возвращает количество символов, записанных в массив s, не считая последнего символа ’\0’ (то есть, длину строки s), при условии, что длина получившейся строки sменьше max.
В противном случае функция возвращает 0, а содержимое массива s не определено.Пример программы#include <time.h>#include <stdio.h>#define SIZE 256intmain (void){charbuffer[SIZE];time_tcurtime;struct tm *loctime;/* Get the current time. */curtime = time(NULL);/* Convert it to local time representation. */loctime = localtime(&curtime);3сокращённое имя дня недели (например, Tue)полное имя дня недели (например, Tuesday)сокращённое имя месяца (например, Nov)полное имя месяца (например, November)дата и время (например, Nov 7 11:32:11 2000)день месяца (например, 07)час в 24-часовой шкале (от 00 до 23)час в 12-часовой шкале (от 01 до 12)день года (от 001)месяц года (от 01)минуты в часе (00–59)индикатор AM/PMсекунды в минуте (00–59)неделя (считая от воскресенья) в году (от 00)день недели (0 — воскресенье)неделя (считая от понедельника) в году (от 00)дата (например, Nov 7 2000)время (например, 11:32:11)год в веке (00-99)год (например, 2000)имя часового пояса (если определено) (например, MSK)символ %%a%A%b%B%c%d%H%I%j%m%M%p%S%U%w%W%x%X%y%Y%Z%%Таблица 1: Спецификаторы формата функции strftime/* Print out the date and time in the standard format.
*/fputs(asctime(loctime), stdout);/* Print it out in a nice format. */strftime(buffer, SIZE, "Today is %A, %B %d.\n", loctime);fputs(buffer, stdout);strftime(buffer, SIZE, "The time is %I:%M %p.\n", loctime);fputs(buffer, stdout);return 0;}1.2 Дополнительные функции POSIXФункции, описанные в предыдущем разделе, позволяют получать время с точностью досекунды. Часто требуется получить время с более высокой точностью.
Для этого стандартPOSIX определяет дополнительные функции.Функция gettimeofday описана следующим образом.#include <sys/time.h>#include <unistd.h>int gettimeofday(struct timeval *tv, struct timezone *tz);Тип struct timeval определён следующим образом.4#include <sys/time.h>struct timeval{long tv_sec;long tv_usec;};/* секунды *//* микросекунды */Второй аргумент этой функции не должен использоваться, он должен иметь значениеNULL. Функция заполняет поле tv_sec структуры tv текущим календарным временем, аполе tv_usec микросекундами в секунде.
Функция возвращает 0 при успешном завершении и -1 при ошибке. В этом случае переменная errno содержит код ошибки (единственнаяпричина возможной ошибки — недопустимый адрес tv).1.3 Приостановка выполнения программыФункции, описываемые в данном разделе, позволяют приостановить выполнение программы на заданный промежуток времени. Функции завершают работу в двух ситуациях:либо истечёт промежуток времени, либо процессу поступит сигнал, который процесс не игнорирует.Функция sleep позволяет приостановить выполнение программы на заданное количество секунд.#include <unistd.h>unsigned int sleep(unsigned int seconds);Выполнение программы приостанавливается на указанное количество секунд.
Выполнениепрограммы продолжится, когда либо истечёт указанный интервал времени, либо в программупоступит неигнорируемый сигнал. Функция возвращает количество секунд, оставшееся доистечения интервала времени (0, если интервал времени истёк).Функция sleep может использовать в своей работе сигнал SIGALRM, поэтому не рекомендуется смешивать вызовы alarm() и sleep().Функция usleep позволяет приостановить выполнение программы на заданное количество микросекунд.#include <unistd.h>void usleep(unsigned long usec);Функция usleep может реализовываться через системный вызов nanosleep (см. ниже).
Обсуждение использования этих функции находится ниже.Системный вызов nanosleep приостанавливает выполнение программы по крайней мере на интервал времени req.#include <time.h>int nanosleep(const struct timespec *req,struct timespec *rem);Структура timespec используется для задания интервалов времени с наносекундной(10−9 ) точностью. Структура определена в файле <time.h> следующим образом.5struct timespec{time_t tv_sec;longtv_nsec;};/* секунды *//* наносекунды */Значение поля tv_nsec должно лежать в пределах 0–999 999 999.nanosleep приостанавливает выполнение программы по крайней мере на время, заданное в *req. Функция может завершиться раньше, если процесс получил неигнорируемыйсигнал.
В этом случае функция возвращает -1, устанавливает переменную errno в значение EINTR и записывает оставшееся время в структуру, на которую указывает rem, еслиrem не равен NULL. Значение *rem может быть использовано для вызова nanosleep длязавершения паузы.В отличие от sleep и usleep, nanosleep не использует никаких сигналов, стандартизован POSIX, позволяет задавать время с большей точностью и позволяет легко продолжитьпаузу после прерывания от сигнала.Для отсчёта времени система использует свой внутренний таймер, имеющий на некоторых машинах (например, i386) частоту 100 Гц, а на других машинах — 1000 Гц. Частота таймера определяется константой HZ, определённой в файле <time.h>.