Читаем Linux API. Исчерпывающее руководство полностью

• Если для установки обработчика сигнала задействован вызов sigaction() с флагом SA_SIGINFO в поле sa.sa_flags, то в качестве второго аргумента обработчику передается структура siginfo_t (см. раздел 21.4). Поля этой структуры определяют файловый дескриптор и тип события, которое с ним произошло.

Стоит отметить, что для передачи обработчику сигнала корректной структуры siginfo_t необходимо использовать оба флага: F_SETSIG и SA_SIGINFO.

Если при выполнении операции F_SETSIG присвоить полю sig значение 0, то мы вернемся к поведению по умолчанию: будет сгенерирован сигнал SIGIO, а его обработчик не получит дополнительный аргумент siginfo_t.

В контексте событий, связанных с возможностью ввода/вывода, нас могут заинтересовать следующие поля структуры siginfo_t, передаваемой обработчику сигнала:

• si_signo — номер сигнала, на который среагировал обработчик. Это значение совпадает с первым аргументом, передаваемым обработчику сигнала.

• si_fd — файловый дескриптор, где произошло событие ввода/вывода.

• si_code — код, указывающий на тип произошедшего события. Значения, которые могут храниться в этом поле, а также их описания приводятся в табл. 59.7.

• si_band — битовая маска, содержащая те же биты, возвращаемые вызовом poll() в аналогичном поле структуры revents. Значение поля si_code соотносится с параметрами битовой маски si_band один к одному (см. табл. 59.7).

Таблица 59.7. Значения полей si_code и si_band в структуре siginfo_t для оповещений о возможности ввода/вывода

si_code — Значение маски si_band — Описание

POLL_IN — POLLIN | POLLRDNORM — Доступен ввод; конец файла

POLL_OUT — POLLOUT | POLLWRNORM | POLLWRBAND — Доступен вывод

POLL_MSG — POLLIN | POLLRDNORM | POLLMSG — Доступно входящее сообщение (не используется)

POLL_ERR — POLLERR — Ошибка ввода/вывода

POLL_PRI — POLLPRI | POLLRDNORM — Доступен высокоприоритетный ввод

POLL_HUP — POLLHUP | POLLERR — Произошел разрыв соединения

Применение операции F_SETSIG можно и дальше оптимизировать, если речь идет о программе, которая занимается исключительно обработкой ввода. Вместо того чтобы отслеживать события ввода/вывода, задействуя обработчик, можно заблокировать назначенный сигнал и затем принимать сигналы из очереди, используя вызов sigwaitinfo() или sigtimedwait() (см. раздел 22.10). Обе эти операции возвращают структуру siginfo_t, содержащую ту же информацию, что передается обработчику сигнала, установленного с помощью флага SA_SIGINFO. Такой способ приема сигналов возвращает нас к асинхронной модели обработки событий, но обеспечивает куда более эффективное получение уведомлений о файловых дескрипторах, в которых произошли события ввода/вывода, если сравнивать с вызовами select() и poll().

Переполнение очереди сигналов

В разделе 22.8 было указано: максимальное количество сигналов реального времени, которые могут попасть в очередь, ограничено. При достижении данного ограничения ядро возвращается к уведомлению о возможности ввода/вывода с помощью стандартного сигнала SIGIO. Так процесс может узнать, что очередь с сигналами переполнена. Вместе с этим теряется информация о том, в каких файловых дескрипторах происходят события ввода/вывода, поскольку сигналы SIGIO не попадают в очередь (кроме того, обработчик SIGIO не получает аргумент siginfo_t; это значит, что он не может определить, какой именно дескриптор сгенерировал сигнал).

Можно снизить вероятность переполнения очереди сигналов, увеличив ее максимальную вместимость, как описывается в разделе 22.8. Однако это не избавляет от необходимости следить за потенциальным переполнением. Хорошо спроектированные приложения, использующие операцию F_SETSIG для получения уведомлений реального времени о возможности ввода/вывода, должны также устанавливать обработчик SIGIO. При получении данного сигнала приложение может очистить очередь с помощью вызова sigwaitinfo() и временно переключиться на применение интерфейсов select() или poll(), которые позволят запрашивать списки файловых дескрипторов с новыми событиями ввода/вывода.

Использование ввода/вывода на основе сигналов в многопоточных приложениях

Начиная с версии 2.6.32 ядро Linux предоставляет два новых, нестандартных флага для вызова fcntl(), позволяющих указать адресата сигналов, оповещающих о «возможности ввода/вывода»: F_SETOWN_EX и F_GETOWN_EX.

Операция F_SETOWN_EX похожа на F_SETOWN, но помимо процесса и группы процессов с ее помощью можно также указать поток выполнения. При ее использовании третьим аргументом вызова fcntl() является указатель на структуру следующего вида:

struct f_owner_ex {

int type;

pid_t pid;

};

Поле type определяет то, как будет интерпретироваться поле pid, и может принимать следующие значения.

• F_OWNER_PGRP — поле pid содержит идентификатор группы процессов, которая будет получать сигналы о возможности ввода/вывода. В отличие от F_SETOWN, идентификатор представляет собой положительное число.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных