POLL(2)                                                 POLL(2)
НАЗВАНИЕ
poll - мультиплексирование потоков
СИНТАКСИС
       |#include <stropts.h>
       |#include <poll.h>
       |
       |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
        присваивается код ошибки.