Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Асинхронное оповещение о завершении операции






Асинхронное оповещение приложения о завершении операций состоит в генерации сигнала при завершении операции. Чтобы это сделать, необходимо внести соответствующие настройки в поле aio_sigevent описателя запроса.

Поле aio_sigevent имеет тип struct sigevent. Эта структура определена в < signal.h> и содержит следующие поля:

int sigev_notify – режим нотификации. Допустимые значения – SIGEV_NONE (не посылать подтверждения), SIGEV_SIGNAL (генерировать сигнал при завершении запроса) и SIGEV_THREAD (при завершении запроса запускать указанную функцию в отдельной нити). Solaris 10 также поддерживает тип оповещения SIGEV_PORT, который рассматривается в приложении к этой лекции.

int sigev_signo – номер сигнала, который будет сгенерирован при использовании SIGEV_SIGNAL.

union sigval sigev_value – параметр, который будет передан обработчику сигнала или функции обработки. При использовании для асинхронного ввода/вывода это обычно указатель на запрос. При использовании SIGEV_PORT это должен быть указатель на структуру port_event_t, содержащую номер порта и, возможно, дополнительные данные.

void (*sigev_notify_function)(union sigval) – функция, которая будет вызвана при использовании SIGEV_THREAD.

pthread_attr_t *sigev_notify_attributes – атрибуты нити, в которой будет запущена sigev_notify_function при использовании SIGEV_THREAD.

Далеко не все реализации libaio поддерживают оповещение SIGEV_THREAD. Некоторые Unix-системы используют вместо него нестандартное оповещение SIGEV_CALLBACK. Далее в этой лекции мы будем обсуждать только оповещение сигналом.

В качестве номера сигнала некоторые приложения используют SIGIO или SIGPOLL (в Unix SVR4 это один и тот же сигнал). Часто используют также SIGUSR1 или SIGUSR2; это удобно потому, что гарантирует, что аналогичный сигнал не возникнет по другой причине. В приложениях реального времени используются также номера сигналов в диапазоне от SIGRTMIN до SIGRTMAX. Некоторые реализации выделяют для этой цели специальный номер сигнала SIGAIO или SIGASYNCIO, но в Solaris 10 такого сигнала нет.

Разумеется, перед тем, как исполнять асинхронные запросы с оповещением сигналом, следует установить обработчик этого сигнала. Для оповещения необходимо использовать сигналы, обрабатываемые в режиме SA_SIGINFO. Установить такой обработчик при помощи системных вызовов signal(2) и sigset(2) невозможно, необходимо использовать sigaction(2). Установка обработчиков при помощи sigaction рассматривается в приложении 2 к этой лекции.

Обработка сигнала в режиме SA_SIGINFO имеет два свойства, каждое из которых полезно для наших целей. Во первых, обработчики таких сигналов имеют три параметра, в отличие от единственного параметра у традиционных обработчиков. Первый параметр имеет тип int и соответствует номеру сигнала, второй параметр имеет тип siginfo_t *, генерируется системой и содержит ряд интересных полей. Нас в данном случае больше всего интересует поле этой структуры si_value. Как раз в этом поле нам передается значение aio_sigevent.sigev_value, которое мы создали при настройке структуры aiocb.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.