POLL(2)

НАЗВАНИЕ
poll - ожидание разнообразных событий на файловом дескрипторе

КРАТКАЯ СВОДКА
#include <sys/poll.h>

int poll(struct pollfd *ufds, unsigned int nfds, int timeout);

ОПИСАНИЕ
poll является вариацией на тему select. Здесь задается массив из nfds структур типа
        struct pollfd {
                int fd;           /* файловый дескриптор */
                short events;     /* запрошенные события */
                short revents;    /* возвращенные события */
        };
и timeout в миллисекундах. Отрицательное значение означает бесконечный тайм-аут. Поле fd содержит файловый дескриптор открытого файла. Поле events-- входной параметр, указывающий битовую маску событий, интересующих приложение. Поле revents-- выходной параметр, куда ядро помещает информацию о произошедших событиях: запрошенных или событий типа POLLERR, POLLHUP или POLLNVAL. (Эти три битовых флага не имеют смысла при использовании в поле events и будут установлены в поле revents, если соответствующее условие истинно.) Если ни одно из запрошенных событий (или ошибок) не случилось, то ядро ждет их появления до тайм-аута. Вот возможные биты, описанные в <sys/poll.h>:
    #define POLLIN      0x0001    /* Можно читать данные */
    #define POLLPRI     0x0002    /* Есть срочные данные */
    #define POLLOUT     0x0004    /* Запись не будет блокирована */
    #define POLLERR     0x0008    /* Произошла ошибка */
    #define POLLHUP     0x0010    /* "Положили трубку" */
    #define POLLNVAL    0x0020    /* Неверный запрос: fd не открыт */
В <asm/poll.h> также определены значения POLLRDNORM, POLLRDBAND, POLLWRNORM, POLLWRBAND и POLLMSG.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
При успешном завершении возвращается положительное значение, равное количеству структур с ненулевыми полями revents (другими словами, дескрипторы с обнаруженными событиями или ошибками). Нуль означает, что системный вызов вышел по тайм-ауту, и ни один из файловых дескрипторов не был выбран. При ошибке возвращается -1, а errno устанавливается в соответствующее значение.

ОШИБКИ

ENOMEM
    Не хватило памяти для создания таблицы файловых дескрипторов.

EFAULT
    Массив, переданный в качестве аргумента, не находится в адресном пространстве вызывающей программы.

EINTR
    До появления запрошенного события произошел сигнал.

СООТВЕТСТВИЕ СТАНДАРТАМ
XPG4-UNIX.

ДОСТУПНОСТЬ
Системный вызов poll() появился в Linux 2.1.23. Библиотечный вызов poll() появился в libc 5.4.28 (использует эмуляцию с помощью select(2), если в вашем ядре нет системного вызова poll(2).

СМОТРИ ТАКЖЕ
select(2)

ПЕРЕВОД
Copyright (C) Alexey Mahotkin <alexm@hsys.msk.ru> 2000