Читаем 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.

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

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

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

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

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

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

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

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

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