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

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

Терминалы не получают сигналы о возможности вывода и разрыве соединения.

С версии ядра 2.4.19 Linux передает сигнал о возможности вывода вторичному псевдотерминалу. Он генерируется всякий раз, когда ввод принимается на первичной стороне.


Именованные каналы и очереди FIFO

Для считывающего конца именованного канала или очереди FIFO сигнал генерируется в следующих ситуациях:

• данные записаны в канал (даже если там уже находится непрочитанный ввод);

• записывающий конец канала закрыт.

Для записывающего конца именованного канала или очереди FIFO сигнал генерируется в следующих ситуациях:

• чтение из канала увеличивает объем свободного пространства в нем, благодаря чему становится возможным записать без блокировки PIPE_BUF байтов;

• считывающий конец канала закрыт.


Сокеты

Ввод/вывод на основе сигналов поддерживает датаграммные сокеты в UNIX- и интернет-доменах. Сигнал генерируется в следующих ситуациях:

• в сокет поступает входящая датаграмма (даже если в очереди находятся другие непрочитанные датаграммы);

• в сокете происходит асинхронная ошибка.

Ввод/вывод на основе сигналов работает также и для потоковых сокетов в обоих доменах. Сигнал генерируется в следующих ситуациях:

• слушающий сокет принял новое соединение;

• завершается TCP-запрос connect(); то есть активный конец TCP-соединения входит в состояние ESTABLISHED (см. рис. 57.5). Условие не срабатывает для сокетов в домене UNIX;

• сокет принял новый ввод (даже если в нем уже доступны непрочитанные данные);

• удаленная сторона закрывает свою записывающую часть соединения с помощью вызова shutdown() или все соединение целиком, используя вызов close();

• становится возможным вывод из сокета (например, когда освобождается место в его исходящем буфере);

• в сокете происходит асинхронная ошибка.


Файловые дескрипторы inotify

Сигнал генерируется, когда становится доступным файловый дескриптор inotify, то есть если с любым из файлов, которые он отслеживает, происходит какое-то событие.


59.3.3. Эффективное использование ввода/вывода на основе сигналов

В приложениях, которым нужно наблюдать за большим количеством (то есть тысячами) файловых дескрипторов (например, отдельными видами сетевых серверов), ввод/вывод на основе сигналов может обеспечить значительное увеличение производительности по сравнению с вызовами select() и poll(). Дело в том, что ядро «запоминает» список отслеживаемых дескрипторов и оповещает программу только в момент, когда с ними происходят события ввода/вывода. Таким образом, производительность программы, применяющей ввод/вывод на основе сигналов, масштабируется в зависимости от количества событий, а не подконтрольных файловых дескрипторов.

Чтобы применять весь потенциал этой методики, нужно выполнить два шага:

• воспользоваться вызовом fcntl() с флагом F_SETSIG (поддерживается только в Linux) с целью указать сигнал реального времени, который должен быть доставлен вместо SIGIO, когда станет возможным ввод/вывод для заданного файлового дескриптора;

• указать флаг при использовании вызова sigaction(), чтобы установить обработчик сигнала реального времени, указанного в предыдущем шаге (см. раздел 21.4).

Операция fcntl() F_SETSIG позволяет указать альтернативный сигнал, который должен быть доставлен вместо SIGIO как оповещение о возможности ввода/вывода для файлового дескриптора:

if (fcntl(fd, F_SETSIG, sig) == -1)

errExit("fcntl");

F_GETSIG выполняет действие, обратное операции F_SETSIG: извлекает сигнал, установленный на данный момент для файлового дескриптора:

sig = fcntl(fd, F_GETSIG);

if (sig == -1)

errExit("fcntl");

Для того чтобы получить определения констант F_SETSIG и F_GETSIG из заголовочного файла , следует определить макрос проверки возможностей _GNU_SOURCE.

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

• По умолчанию для оповещения о возможности ввода/вывода применяется стандартный сигнал SIGIO, который минует очередь. Если события начнут поступать в момент, когда этот сигнал заблокирован (возможно, его обработчик уже вызван), то все они, кроме первого, будут утеряны. При использовании вместо SIGIO сигнала реального времени F_SETSIG уведомления будут складываться в очередь.

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

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

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

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

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

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

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

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