НАЗВАНИЕ
poll - мультиплексирование псевдоустройств по вводу/выводу
СИНТАКСИС
#include <stropts.h> #include <poll.h>
int poll (fds, nfds, timeout) struct pollfd fds [ ]; unsigned long nfds; int timeout;
ОПИСАНИЕ
Системный вызов poll предоставляет пользователю механизм одновременного управления вводом/выводом (мультиплексирования) для набора дескрипторов открытых потоков [см. ]. Poll идентифицирует потоки, с которыми пользователь может обменяться сообщениями, а также потоки, в которых произошли определенные события. Сообщения можно принимать с помощью системных вызовов или , а посылать посредством или . Некоторые команды из группы , такие как I_RECVFD и I_SENDFD [см. ], также могут быть использованы для приема и посылки сообщений.
Аргумент fds задает дескрипторы файлов, которые должны анализироваться, и интересующие пользователя события для каждого из дескрипторов. Fds есть указатель на массив из стольких элементов, сколько дескрипторов файлов интересует пользователя. Элементами массива являются структуры типа pollfd, содержащие следующие элементы:
int fd; /* Дескриптор файла */ short events; /* Интересующие события */ short revents; /* Происшедшие события */
Компонент fd задает дескриптор открытого файла, а events и revents являются масками, построенными с помощью побитной операции ИЛИ из следующих флагов:
POLLIN В очереди чтения истока есть неприоритетное сообщение или сообщение, передающее дескриптор файла (см. I_RECVFD). Этот флаг устанавливается и в том случае, если сообщение имеет нулевую длину. В компоненте revents этот флаг не может присутствовать одновременно с флагом POLLPRI. POLLPRI В очереди чтения истока есть приоритетное сообщение. Этот флаг устанавливается и в том случае, если сообщение имеет нулевую длину. В компоненте revents этот флаг не может присутствовать одновременно с флагом POLLIN. POLLOUT Верхняя очередь записи потока неполна [см. ]. Приоритетные управляющие сообщения могут быть посланы в любое время (см. ). POLLERR В исток потока поступило сообщение об ошибке. Флаг допустим только в revents; в events он не используется. POLLHUP В потоке произошло освобождение линии. Этот флаг не может присутствовать одновременно с флагом POLLOUT: поток не может быть доступным на запись, если произошло освобождение линии. Этот флаг, однако, может присутствовать одновременно с флагами POLLIN и POLLPRI. Флаг POLLHUP допустим только в revents; в events он не используется. POLLNVAL Дескриптор fd не соответствует открытому потоку. Флаг допустим только в revents; в events он не используется.