Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет_лаба2.docx
Скачиваний:
0
Добавлен:
01.03.2025
Размер:
33.6 Кб
Скачать
    1. Таймеры.

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().

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

timer_create

Синтаксис

#include <signal.h>

#include <time.h>

int timer_create(

clockid_t clock_id,

struct sigevent *evp,

timer_t *timerid);

Аргументы

clock_id идентификатор часов, с которыми будет связан создаваемый таймер evp указатель на структуру sigevent, описывающую способ оповещения о срабатывании таймера timerid указатель на переменную, в которую будет помещен идентификатор созданного таймера

Описание

Функция timer_create() создает таймер, используя часы clock_id для отсчета времени. В случае успешного выполнения функции в переменную типа timer_t, на которую указывает аргумент timerid будет помещен идентификатор созданного таймера. В дальнейшем этот идентификатор может быть использован при вызове функций timer_settime(), timer_gettime(), timer_getoverrun() и timer_delete().

Аргумент evp, если он не равен NULL, должен указывать на структуру sigevent, описывающую способ оповещения о срабатывании таймера. Эта структура должна быть заранее создана прикладной программой.

timer_settime

#include <time.h>

int timer_settime(

timer_t timerid,

int flags,

const struct itimerspec *value,

struct itimerspec *ovalue);

Аргументы

timerid

идентификатор таймера;

flags

флаги;

value

устанавливаемое значение таймера;

ovalue

старое значение таймера.

Описание

Функция timer_settime() устанавливает время до следующего срабатывания таймера, заданного аргументом timerid. Устанавливаемое значение находится в структуре itimerspec, на которое указывает аргумент value. Эта структура содержит следующие элементы.

srtuct timespec it_interval периодичность запуска

struct timespec it_value значение таймера

Если значения времени, указанные элементами it_interval или it_value не кратны разрешающей способности часов, связанных с таймером, то они будут округлены до большего значения, кратного разрешающей способности.

Если флаг TIMER_ABSTIME в аргументе flags не установлен, то время до следующего срабатывания таймера равно интервалу, заданному в поле it_value структуры, указанной аргументом value. Если флаг TIMER_ABSTIME в аргументе flags установлен, то время до следующего срабатывания таймера равно разности между абсолютным временем, заданным в поле it_value структуры, указанной аргументом it_value, и текущим показанием часов, связанных с таймером. То есть таймер сработает, когда часы покажут время, заданное в поле it_value структуры value. Если указанное время уже истекло, то функция считается выполненной успешно, и будет выдано извещение об истечении времени.

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

Если значение it_value в структуре, на которую указывает аргумент value не равно 0, то функция timer_settime() запустит таймер. В противном случае таймер не будет включен или будет остановлен, если он был включен ранее.

Если значение it_interval не равно нулю, то после срабатывания таймер будет установлен и запущен заново со значением, равным элементу it_interval структуры, на которую указывает аргумент value. Таким образом, таймер будет периодическим (многоразовым).

Если аргумент ovalue не равен NULL, то в структуру, на которую он указывает, будет записано предыдущее значение времени до срабатывания таймера (даже если при установке таймера был установлен флаг TIMER_ABSTIME) или 0, если таймер не был запущен, а также предыдущее значение периодичности запуска таймера. Эти значения зависят от разрешающей способности таймера и равны в точности тем значениям, которые были бы возвращены при вызове timer_gettime() в этот момент времени.

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

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