POLL(2) POLL(2)
НАЗВАНИЕ
poll - мультиплексирование псевдоустройств по вводу/вы-
воду
СИНТАКСИС
#include
#include
int poll (fds, nfds, timeout)
struct pollfd fds [ ];
unsigned long nfds;
int timeout;
ОПИСАНИЕ
Системный вызов poll предоставляет пользователю меха-
низм одновременного управления вводом/выводом (мультип-
лексирования) для набора дескрипторов открытых потоков
[см. intro(2)]. Poll идентифицирует потоки, с которыми
пользователь может обменяться сообщениями, а также по-
токи, в которых произошли определенные события. Сообще-
ния можно принимать с помощью системных вызовов read(2)
или getmsg(2), а посылать посредством write(2) или
putmsg(2). Некоторые команды из группы ioctl(2), такие
как I_RECVFD и I_SENDFD [см. streamio(7)], также могут
быть использованы для приема и посылки сообщений.
Аргумент fds задает дескрипторы файлов, которые должны
анализироваться, и интересующие пользователя события
для каждого из дескрипторов. Fds есть указатель на мас-
сив из стольких элементов, сколько дескрипторов файлов
интересует пользователя. Элементами массива являются
структуры типа pollfd, содержащие следующие элементы:
int fd; /* Дескриптор файла */
short events; /* Интересующие события */
short revents; /* Происшедшие события */
Компонент fd задает дескриптор открытого файла, а
events и revents являются масками, построенными с по-
мощью побитной операции ИЛИ из следующих флагов:
POLLIN
В очереди чтения истока есть неприоритетное сооб-
щение или сообщение, передающее дескриптор файла
(см. I_RECVFD). Этот флаг устанавливается и в том
случае, если сообщение имеет нулевую длину. В ком-
поненте revents этот флаг не может присутствовать
одновременно с флагом POLLPRI.
POLLPRI
В очереди чтения истока есть приоритетное сообще-
ние. Этот флаг устанавливается и в том случае, ес-
ли сообщение имеет нулевую длину. В компоненте
revents этот флаг не может присутствовать одновре-
менно с флагом POLLIN.
POLLOUT
Верхняя очередь записи потока неполна [см.
intro(2)]. Приоритетные управляющие сообщения мо-
гут быть посланы в любое время (см. putmsg(2)).
POLLERR
В исток потока поступило сообщение об ошибке. Флаг
допустим только в revents; в events он не исполь-
зуется.
POLLHUP
В потоке произошло освобождение линии. Этот флаг
не может присутствовать одновременно с флагом
POLLOUT: поток не может быть доступным на запись,
если произошло освобождение линии. Этот флаг, од-
нако, может присутствовать одновременно с флагами
POLLIN и POLLPRI. Флаг POLLHUP допустим только в
revents; в events он не используется.
POLLNVAL
Дескриптор fd не соответствует открытому потоку.
Флаг допустим только в revents; в events он не ис-
пользуется.
Для каждого элемента массива, на который указывает ар-
гумент fds, poll проверяет дескриптор файла fd на нали-
чие событий, указанных в events. Количество дескрипто-
ров файлов задается аргументом nfds. Если nfds превос-
ходит NOFILES - системное ограничение на количество од-
новременно открытых файлов [см. intro(2)] - poll завер-
шается неудачей.
Если значение fd меньше нуля, events игнорируется, а
revents для этого элемента устанавливается равным 0.
Результаты работы системного вызова poll помещаются в
поле revents структуры типа pollfd. Единичные биты в
revents показывают, какие из событий, интересующих
пользователя, произошли. Если ни одно из событий не
произошло, poll возвращает в revents нулевые значения
бит. Флаги POLLHUP, POLLERR и POLLNVAL устанавливаются
в revents, если выполнены соответствующие условия; это
происходит даже тогда, когда перечисленные флаги не ус-
тановлены в поле events.
Если ни одно из ожидаемых событий ни для одного из ука-
занных дескрипторов файлов не имеет места, poll будет
ждать как минимум timeout миллисекунд того, чтобы по
крайней мере одно событие хотя бы для одного дескрипто-
ра произошло. На компьютерах, где время не может быть
измерено с точностью до миллисекунд, timeout округляет-
ся до ближайшего доступного системе значения. Если зна-
чение timeout равно 0, poll возвращает управление не-
медленно. Если значение timeout равно -1, poll ждет,
пока не произойдет одно из событий, или системный вызов
не будет прерван. Флаг O_NDELAY не влияет на poll.
Системный вызов poll завершается неудачей, если выпол-
нено хотя бы одно из следующих условий:
[EAGAIN] Разместить внутренние структуры данных не
удалось, но запрос следует повторить.
[EFAULT] Какой-либо аргумент указывает за пределы
отведенного процессу адресного пространст-
ва.
[EINTR] Во время выполнения системного вызова пе-
рехвачен сигнал.
[EINVAL] Аргумент nfds меньше 0 или больше NOFILES.
СМ. ТАКЖЕ
intro(2), read(2), getmsg(2), putmsg(2), write(2).
streamio(7) в Справочнике администратора.
ДИАГНОСТИКА
При успешном завершении возвращается неотрицательное
целое число. Положительный результат равен количеству
дескрипторов, для которых произошли события (то есть
компонент revents не равен 0). Нулевой результат озна-
чает, что истек таймаут, а никаких событий не произош-
ло. В случае ошибки возвращается -1, а переменной errno
присваивается код ошибки.
|