Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
vovk.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
456 Кб
Скачать
☆

42. Створення та використання таймерів в ос qnx-6.

Чтобы работать с таймером необходимо: создать объект типа «таймер», выбрать схему уведомления (сигнал, импульс или создание потока) и создать структуру уведомления (struct sigevent), выбрать нужный тип таймера (относительный или абсолютный, однократный или периодический), запустить таймер.

Создание таймера при помощи функции timer_create().

#include <time.h>

#include <sys/siginfo.h>

Int timer_create(clockid_t clock_id, struct sigevent *event, timer_t *timerid);

Аргумент clock_id сообщает функции, на каком временном базисе формируется таймер (CLOCK_REALTIME, CLOCK_SOFTTIME, CLOCK_MONOTONIC). Последний аргумент функции – дескриптор таймера в таблице таймеров ядра.

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

#include <time.h>

Int timer_settime(timer_t timerid, int flags, struct itimerspec *value, struct itmerspec *oldvalue);

С помощью flags определяется тип таймера – абсолютный или относительный, елси будет стоять константа TIMER_ABSTIME – абсолютный таймер, если нуль – относительный таймер.

Struct timespec {long tv_sec, tv_nsec};

Structu itimerspec {struct timespec it_value, it_interval};

Параметр it_value задает либо интервал времени от настоящего момента до момента срабатывания таймера (относительный таймер), либо собственно время срабатывания (абсолютный таймер). После срабатывания таймера значение величины it_interval задает относительное время для повторной загрузки таймера, чтобы он мог сработать снова (если 0 – однократный таймер).

43. Тайм-аути ядра ос qnx-6.

Когда время работы таймера истекло, происходит тайм-аут. QNX/Neutrino позволяет получать тайм-ауты по всем блокированным состояниям. Наиболее часто потребность в этом возникает при обмене сообщениями: клиент, посылая, сообщение серверу, не желает ждать ответа вечно. Тайм-ауты ядра также полезны в сочетании с функцией pthread_join(): завершение потока тоже не хочется долго ждать. Функция TimerTimeout() является системным вызовом, ответственным за формирование тайм-аутов ядра.

#include <sys/neutrino.h>

Int TimerTimeout(clockid_t id, int flags, const struct sigevent * notify, const uint64_t * ntime, uint64 * otime);

Функция возвращает целое чилос – индикатор удачи/неудачи (0 – все в порядке, -1 – произошла ошибка, код которой записывается в errno). Источник синхроимпульсов указывается в id. Параметр notify всегда должен быть событием уведомления типа SIGEV_UNBLOCK; параметр ntime указывает относительное время, спустя которое ядро должно сгенерировать тайм-аут. Параметр otime показывает предыдущее значение тайм-аута и в большинстве случаев не используется (NULL). Тайм-ауты «взводятся» функцией TimerTimeout(), а запускаются по входу в одно из состояний, указанных в параметра flags. Сбрасывается тайм-аут при возврате из любого системного вызова. Это означает, что тайм-аут нужно «взводить» перед каждым системным вызовом, к которому надо его применить. Сбрасывать таймер после системного вызова не надо – это выполняется автоматически.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]