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

В табл. 59.5 собраны подробности о записывающем конце канала. Мы исходим из того, что поле events вызова poll() содержит флаг POLLOUT. Столбец «Место для PIPE_BUF байт?» указывает на то, достаточно ли в канале места для автоматической записи PIPE_BUF байтов без блокировки. Это критерий, по которому Linux определяет готовность канала к записи. Ряд других реализаций UNIX поступает аналогичным образом. Но есть системы, считающие канал доступным для записи, если в него можно записать хотя бы один байт. (В Linux 2.6.10 и ниже вместимость именованного канала была равна PIPE_BUF; это значит, что канал считался недоступным для записи при наличии в нем хотя бы одного байта данных.)


Таблица 59.5. Параметры, возвращаемые вызовами select() и poll() для записывающего конца именованного канала и очереди FIFO

Условие или событие

select()

poll()

Данные в канале?

Записывающий конец открыт?

Нет

Нет

w

POLLERR

Да

Да

w

POLLOUT

Да

Нет

w

POLLOUT | POLLERR


В некоторых других UNIX-системах, если считывающий конец канала закрыт, то вызов poll() возвращается с установленным битом POLLERR, а не POLLHUP. Проверяя возможность блокировки операции записи, портируемые приложения должны учитывать оба эти бита.


Сокеты

В табл. 59.6 описывается поведение вызовов select() и poll() для сокетов. В столбце poll() предполагается, что поле events равно (POLLIN | POLLOUT | POLLPRI). В столбце select() мы исходим из такого условия: файловый дескриптор проверяется на возможность ввода, вывода или наличия исключительного условия (то есть дескриптор указан во всех трех наборах, которые передаются в select()). Эта таблица охватывает только распространенные сценарии.

В ОС Linux поведение вызова poll() для сокетов домена UNIX отличается от показанного в табл. 59.6, если проверка выполняется после закрытия удаленного конца соединения: помимо прочих флагов в поле revents возвращается бит POLLHUP.


Таблица 59.6. Параметры, возвращаемые вызовами select() и poll() для сокетов

Условие или событие — select() — poll()

Доступен ввод — r — POLLIN

Возможен вывод — w — POLLOUT

Слушающий сокет установил входящее соединение — r — POLLIN

Получены внеканальные данные (только для TCP) — x — POLLPRI

Удаленный потоковый сокет разорвал соединение или выполнил shutdown(SHUT_WR) — rw — POLLIN | POLLOUT | POLLRDHUP


Флаг POLLRDHUP (доступный только в Linux 2.6.17 и выше) требует дополнительного разъяснения. На самом деле он имеет вид EPOLLRDHUP и предназначен в основном для использования в режиме срабатывания по фронту программного интерфейса epoll (см. раздел 59.4). Он возвращается, когда потоковый сокет на другом конце соединения закрывает свой записывающий канал. Этот флаг позволяет приложению задействовать интерфейс epoll, срабатывающий по фронту, чтобы упростить распознавание удаленного закрытия (альтернативой было бы определить наличие флага POLLIN и выполнить операцию read(), которая в случае удаленного закрытия возвращает 0).


59.2.4. Сравнение вызовов select() и poll()

В этом подразделе мы сосредоточим внимание на сходствах и отличиях, присущих вызовам select() и poll().


Отличия в программных интерфейсах

Ниже перечислены отдельные различия между программными интерфейсами select() и poll().

• Использование типа данных fd_set ограничивает максимальное количество файловых дескрипторов, которое можно отследить с помощью вызова select() (FD_SETSIZE). В Linux это ограничение по умолчанию равно 1024, а его изменение требует повторной компиляции приложения. Для сравнения: вызов poll() не имеет никаких внутренних ограничений на диапазон отслеживаемых файловых дескрипторов.

• Аргументы типа fd_set возвращают результат, поэтому, если вызов select() выполняется в цикле, их нужно заново инициализировать на каждой итерации. Вызов poll() применяет отдельные поля events (для ввода) и revents (для вывода), так что на него данное требование не распространяется.

• Вызов select() обеспечивает более высокую точность времени ожидания по сравнению с poll() (микросекунды вместо миллисекунд). Хотя в обоих случаях точность ограничивается системными часами.

• Если один из наблюдаемых файловых дескрипторов был закрыт, то вызов poll() установит бит POLLNVAL в поле revents соответствующего дескриптора. Для сравнения: вызов select() просто возвращает –1 с ошибкой EBADF; чтобы определить, какой именно дескриптор закрылся, придется проверять ошибки соответствующих системных вызовов ввода/вывода. Однако в большинстве случаев эта разница несущественна, так как приложение обычно способно само отслеживать закрывающиеся дескрипторы.


Портируемость

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

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

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#.Введите сюда краткую аннотацию

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

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