Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы / часы_таймеры_потоки.DOC
Скачиваний:
30
Добавлен:
01.05.2014
Размер:
351.23 Кб
Скачать

17

стр. 17из17

Часы и таймеры

Часы

time()

clock_gettime()

clock_settime()

clock_getres()

Для хранения интервала времени, выраженного в секундах, используются переменные типа time_t.

Функция time() позволяет получить значение часов с точностью до 1 секунды. Эта функция позволяет опрашивать только системные часы.

time

Синтаксис

#include <time.h>

time_t time(time_t *tloc);

Для более точного измерения времени используется структура timespec, которая содержит следующие элементы:

Тип элемента

Идентификатор элемента

Описание

time_t

tv_sec

секунды

long

tv_nsec

наносекунды

Допустимым значением элемента tv_nsec является величина, большая или равная нулю и меньшая количества наносекунд в 1 секунде (1000 млн.). Временной интервал, описываемый данной структурой, составляет

(tv_sec * 1,000,000,000 + tv_nsec) наносекунд.

Оба типа данных (time_t и timespec) могут использоваться для хранения календарного времени. В этом случае хранящиеся в них данные интерпретируются как время, прошедшее с 0 часов 1 января 1970 года.

Структура tm позволяет хранить дату и время в общепринятом виде. Она содержит следующие элементы:

Тип элемента

Идентификатор элемента

Описание

int

tm_sec

секунды

int

tm_min

минуты

int

tm_hour

часы (с 0)

int

tm_mday

день месяца (с 1)

int

tm_mon

месяц (с 0)

int

tm_year

год с 1900

int

tm_wday

день недели (воскресенье - 0)

int

tm_yday

день в году (с 0)

int

tm_isdst

флаг "летнее время"

Система всегда содержит, по крайней мере, одни часы с идентификатором CLOCK_REALTIME (системные часы). Значение этих часов интерпретируется как календарное время, то есть время (в секундах и наносекундах), истекшее с 0 часов 1 января 1970 года.

Функция clock_settime() позволяет установить показания часов, функция clock_gettime() - опросить показания часов, а clock_getres() - узнать разрешающую способность часов. Все три функции работают с высокой точностью, так как используют структуру timespec. Отметим, однако, результаты измерения времени не могут быть точнее, чем разрешающая способность часов.

Clock_gettime

Синтаксис

#include <time.h>

int clock_gettime(

clockid_t clock_id,

struct timespec *tp);

Аргументы

clock_id

идентификатор часов;

tp

указатель на структуру timespec, в которую записываются показания часов.

Описание

Функция clock_gettime() записывает текущие показания часов clock_id в структуру timespec, на которую указывает аргумент tp.

clock_settime

Синтаксис

#include <time.h>

int clock_settime(

clockid_t clock_id,

const struct timespec *tp);

Описание

Функция clock_settime() устанавливает часы, указанные аргументом clock_id, в соответствии со значением, определенным аргументом tp. Если указанное аргументом tp значение времени не кратно разрешающей способности указанных часов, то оно уменьшается до наибольшего кратного значения.

clock_getres

Синтаксис

#include <time.h>

int clock_getres(

clockid_t clock_id,

struct timespec *res);

Описание

Функция clock_getres() позволяет выяснить разрешающая способность часов. Если значение аргумента res не равно NULL, то разрешающая способность указанных часов будет записана в структуру timespec, на которую указывает аргумент res.

Функции localtime() и localtime_r() позволяют получить локальное время, а функции gmtime() и gmtime_r() - мировое время. Все четыре функции формируют результат в структуре tm, а в качестве исходных данных получают календарное время в секундах, то есть количество секунд, истекших с 0 часов 1 января 1970 года, UTC. Таким образом, исходные данные для этих функций можно получить с помощью функции time().

Функция mktime() преобразует локальное время, записанное в структуре tm, в календарное время (количество секунд, истекшее с 0 часов 1 января 1970 года, UTC).

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <math.h>

#include <sys/time.h>

struct timeval tv1,tv2;

Int main(int argc, char **argv)

{

int i, ntimes=100000;

float d1;

gettimeofday(&tv1, NULL);

for(i=0;i<ntimes;i++)

d1=sin(i)

;

gettimeofday(&tv2, NULL);

tv2.tv_usec += 1000000*(tv2.tv_sec-tv1.tv_sec);

d1 = (float)(tv2.tv_usec - tv1.tv_usec)/1000000.;

printf("\ndelta sec %f \n", d1);

}

Таймеры

nanosleep()

sleep()

alarm().

timer_create()

timer_settime()

timer_gettime()

timer_getoverrun()

timer_delete()

Для посылки сигнала в определенный момент в будущем можно использовать функцию alarm(). Эта функция предписывает системе сгенерировать сигнал SIGALRM через указанный интервал времени (в секундах).

Программные таймеры позволяют запланировать выполнение какой-либо деятельности в определенный момент времени в будущем. Для создания таймера используется функция timer_create(). Одним из аргументов этой функции является структура sigevent, которая определяет вид оповещения о срабатывании таймера (например, посылка сигнала или выполнение указанной функции).

Функция timer_create() только создает таймер, но не запускает его. Установка и запуск таймера производится функцией timer_settime(). Функция timer_settime() определяет время первого срабатывания таймера, а также период срабатывания (если требуется периодическое срабатывание таймера). Для первого срабатывания таймера можно указать либо абсолютное время срабатывания (то есть таймер сработает, когда часы покажут указанное время), либо относительное (интервал времени, через который должен сработать таймер).

Если указан период срабатывания таймера, то после каждого срабатывания таймера он будет заново установлен и запущен со значением, равным указанному периоду. Функция timer_settime() также позволяет остановить (сбросить) таймер.

Функция timer_gettime() позволяет опросить время, оставшееся до срабатывания таймера, а также период срабатывания.

Если для оповещения о срабатывании таймера используется сигнал, то при повторном срабатывании таймера сигнал не будет послан, если предыдущий сигнал не был обработан. С помощью функции timer_getoverrun() можно получить количество срабатываний таймера, произошедших между моментом генерирования сигнала (постановки в очередь) и моментом доставки или приема.

Когда потребность в таймере отпадет, его можно удалить функцией timer_delete().

Сброс и переустановка таймера не влияет на ранее выданные сигналы о срабатывании таймера, даже если они еще не были обработаны.

Соседние файлы в папке Материалы