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

ready = 0

timeout after select(): 0.000

Вызов select() немедленно возвращается, не найдя ни одного готового дескриптора.

В следующем примере мы отслеживаем два файловых дескриптора с номерами 0 (для ввода) и 1 (для вывода). Аргументу timeout присваивается значение NULL (первый аргумент командной строки равен знаку минус), что говорит о бесконечном времени ожидания:

$ ./t_select — 0r 1w

ready = 1

0:

1: w

Вызов select() немедленно возвращается, информируя нас о возможности вывода для дескриптора 1.


59.2.2. Системный вызов poll()

Системный вызов poll() может выполнять действие, сравнимое с select(). Главное отличие между этими двумя операциями состоит в том, каким способом задаются дескрипторы для мониторинга. Вызов select() предоставляет три набора; каждый из них должен сигнализировать о готовности тех или иных дескрипторов. Вызов poll() предоставляет один список; каждый дескриптор в нем имеет набор событий, которые нас интересуют.

#include


int poll(struct pollfd fds[], nfds_t nfds, int timeout);

Возвращает количество готовых файловых дескрипторов, 0, если истекло время ожидания, или -1 при ошибке

Аргумент fds и массив pollfd (nfds) обозначают файловые дескрипторы, которые нужно отслеживать. Аргумент timeout можно использовать, чтобы задать максимальный отрезок времени, на протяжении которого будет блокироваться вызов poll(). Каждый из представленных аргументов подробно описывается ниже.


Массив pollfd

Аргумент fds содержит список файловых дескрипторов, за которыми вызов poll() должен наблюдать. Это массив структур типа pollfd, определяемых следующим образом:

struct pollfd {

int fd; /* Файловый дескриптор */

short events; /* Битовая маска с заданными событиями */

short revents; /* Битовая маска с возвращаемыми событиями */

};

Аргумент nfds обозначает количество элементов в массиве fds. Тип данных nfds_t, применяемый в аргументе nfds, представляет собой беззнаковое целое число.

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

В табл. 59.2 перечислены биты, которые могут содержаться в полях events и revents. Первая группа битов (POLLIN, POLLRDNORM, POLLRDBAND, POLLPRI и POLLRDHUP) относится к событиям ввода, а вторая (POLLOUT, POLLWRNORM и POLLWRBAND) — к событиям вывода. Третья группа (POLLERR, POLLHUP и POLLNVAL) содержит биты, устанавливаемые в поле revents для получения дополнительных сведений о файловом дескрипторе. Любой из этих трех битов будет проигнорирован, если указать его в поле events. Последний бит, POLLMSG, не используется в вызове poll(), реализованном в Linux.

В UNIX-системах, предоставляющих механизм STREAMS для символьных устройств, бит POLLMSG уведомляет о том, что сообщение с сигналом SIGPOLL достигло начала потока. Linux не использует бит POLLMSG, так как не поддерживает механизм STREAMS.


Таблица 59.2. Значения битовых масок для полей events и revents структуры pollfd

Бит — Передается в events? — Возвращается из revents? — Описание

POLLIN — * — * — Данные (не считая высокоприоритетных) могут быть прочитаны

POLLRDNORM — * — * — Эквивалент бита POLLIN

POLLRDBAND — * — * — Приоритетные данные могут быть прочитаны (не используется в Linux)

POLLPRI — * — * — Высокоприоритетные данные могут быть прочитаны

POLLRDHUP — * — * — Удаленный сокет был закрыт

POLLOUT — * — * — Обычные данные могут быть записаны

POLLWRNORM — * — * — Эквивалент бита POLLOUT

POLLWRBAND — * — * — Приоритетные данные могут быть записаны

POLLERR — * — Произошла ошибка

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

POLLNVAL — * — Файловый дескриптор не открыт

POLLMSG — Не используется в Linux (и не входит в стандарт SUSv3)


При отсутствии надобности в событиях для конкретного файлового дескриптора полю events можно присвоить 0. Кроме того, если указать отрицательное значение для fd (например, путем умножения номера дескриптора на –1, при условии, что тот не равен нулю), соответствующее поле events будет проигнорировано, а events в любом случае вернет 0. Любой из вариантов можно использовать, чтобы отключить мониторинг определенного файлового дескриптора (возможно, временно) без необходимости заново создавать весь список fds.

Стоит отметить следующие аспекты реализации вызова poll() в Linux.

• Биты POLLIN и POLLRDNORM определены отдельно, но являются синонимами.

• Биты POLLOUT и POLLWRNORM определены отдельно, но являются синонимами.

• Бит POLLRDBAND обычно не применяется, то есть игнорируется в поле events и не указывается в revents.

Бит POLLRDBAND указывается только в коде, реализующем (устаревший) сетевой протокол DECnet.

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

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

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

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

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