Provided by: manpages-ru-dev_4.27.0-1_all bug

НАИМЕНОВАНИЕ

       epoll_ctl - интерфейс управления файловым дескриптором epoll

БИБЛИОТЕКА

       Стандартная библиотека языка C (libc, -lc)

ОБЗОР

       #include <sys/epoll.h>

       int epoll_ctl(int epfd, int op, int fd,
                     struct epoll_event *_Nullable event);

ОПИСАНИЕ

       Данный  системный  вызов,  используется  для добавления, изменения или удаления записей в списке interest
       экземпляра epoll(7), на который указывает файловый дескриптор epfd. Он запрашивает выполнение операции op
       для файлового дескриптора назначения fd.

       Допустимые значения аргумента op:

       EPOLL_CTL_ADD
              Add an entry to the interest list of the epoll file descriptor, epfd.  The entry includes the file
              descriptor, fd, a reference  to  the  corresponding  open  file  description  (see  epoll(7)   and
              open(2)), and the settings specified in event.

       EPOLL_CTL_MOD
              Изменить настройки, связанные с fd в списке interest, на новые, указанные в event.

       EPOLL_CTL_DEL
              Удалить  (отменить  регистрацию)  файлового дескриптора назначения fd из списка interest. Значение
              event игнорируется и может быть NULL (но смотрите ДЕФЕКТЫ далее).

       The event argument describes the object linked to the file descriptor  fd.   The  struct  epoll_event  is
       described in epoll_event(3type).

       The  data  member of the epoll_event structure specifies data that the kernel should save and then return
       (via epoll_wait(2))  when this file descriptor becomes ready.

       The events member of the epoll_event structure is a bit mask composed by  ORing  together  zero  or  more
       event types, returned by epoll_wait(2), and input flags, which affect its behaviour, but aren't returned.
       The available event types are:

       EPOLLIN
              Связанный файл доступен для чтения с помощью read(2).

       EPOLLOUT
              Связанный файл доступен для записи с помощью write(2).

       EPOLLRDHUP (начиная с Linux 2.6.17)
              Одна  из  сторон  потокового сокета закрыла соединение или выключила записывающую часть соединения
              (этот флаг особенно полезен при написании простого  кода  для  обнаружения  отключения  стороны  с
              помощью слежения edge-triggered).

       EPOLLPRI
              Исключительное состояние файлового дескриптора. Смотрите описание POLLPRI в poll(2).

       EPOLLERR
              Возникло  ошибочное  состояние  связанного  файлового  дескриптора. Это событие также возникает на
              пишущей стороне канала, когда читающий конец закрылся.

              epoll_wait(2)  will always report for this event; it is not necessary to set  it  in  events  when
              calling epoll_ctl().

       EPOLLHUP
              Произошло зависание связанного файлового дескриптора.

              epoll_wait(2)   will  always  wait  for  this  event; it is not necessary to set it in events when
              calling epoll_ctl().

              Заметим, что при чтении из канала, такого как  канал  (pipe)  или  потоковый  сокет,  это  событие
              всего-навсего  показывает,  что  партнёр закрыл канал со своего конца. Дальнейшее чтение из канала
              будет возвращать 0 (конец файла) только после потребления всех неполученных данных в канале.

       И доступные флаги ввода:

       EPOLLET
              Requests edge-triggered notification for the associated file descriptor.  The default behavior for
              epoll is level-triggered.  See epoll(7)  for more detailed information  about  edge-triggered  and
              level-triggered notification.

       EPOLLONESHOT (начиная с Linux 2.6.2)
              Requests one-shot notification for the associated file descriptor.  This means that after an event
              notified for the file descriptor by epoll_wait(2), the file descriptor is disabled in the interest
              list  and no other events will be reported by the epoll interface.  The user must call epoll_ctl()
              with EPOLL_CTL_MOD to rearm the file descriptor with a new event mask.

       EPOLLWAKEUP (начиная с Linux 3.5)
              Если флаги EPOLLONESHOT и EPOLLET сброшены и процесс имеет мандат CAP_BLOCK_SUSPEND, то убедитесь,
              что система не находится в режиме «suspend» или «hibernate», пока это  событие  ожидает  обработки
              или обрабатывается. Событие считается «обрабатывающимся» начиная с момента, когда оно возвращается
              вызовом  epoll_wait(2)  и  до  следующего  вызова  epoll_wait(2) для того же файлового дескриптора
              epoll(7), закрытия этого файлового дескриптора, удаление файлового дескриптора события  с  помощью
              EPOLL_CTL_DEL  или  сброс  EPOLLWAKEUP  для файлового дескриптора события с помощью EPOLL_CTL_MOD.
              Также смотрите ДЕФЕКТЫ.

       EPOLLEXCLUSIVE (начиная с Linux 4.5)
              Установить единоличный режим пробуждения файлового дескриптора epoll, присоединённого  к  целевому
              файловому  дескриптору  fd.  При  появлении  события  пробуждения  и к целевому файлу присоединены
              несколько файловых дескрипторов epoll с  помощью  EPOLLEXCLUSIVE,  то  события  получат  один  или
              несколько  файловых  дескрипторов  epoll  через  epoll_wait(2).  По  умолчанию в этом случае (если
              EPOLLEXCLUSIVE не установлен) все файловые  дескрипторы  epoll  получают  событие.  Таким  образом
              EPOLLEXCLUSIVE в некоторых случаях помогает избежать проблем стадной работы.

              Если  один  файловый  дескриптор  указан  в  нескольких  экземплярах  epoll,  и  одни  имеют  флаг
              EPOLLEXCLUSIVE, а другие нет, то события  получат  все  экземпляры  epoll,  у  которых  не  указан
              EPOLLEXCLUSIVE, и, как минимум, один экземпляр epoll, у которого есть задан EPOLLEXCLUSIVE.

              Следующие  значения  можно  указывать  вместе  с  EPOLLEXCLUSIVE: EPOLLIN, EPOLLOUT, EPOLLWAKEUP и
              EPOLLET. Также можно указывать EPOLLHUP и EPOLLERR, но они не  обязательны:  как  обычно,  события
              всегда  приходят,  если  они  возникают,  независимо  указаны ли они в events. При указании других
              значений в events возникает ошибка EINVAL.

              EPOLLEXCLUSIVE may be used only  in  an  EPOLL_CTL_ADD  operation;  attempts  to  employ  it  with
              EPOLL_CTL_MOD yield an error.  If EPOLLEXCLUSIVE has been set using epoll_ctl(), then a subsequent
              EPOLL_CTL_MOD  on  the  same epfd, fd pair yields an error.  A call to epoll_ctl()  that specifies
              EPOLLEXCLUSIVE in events and specifies the target file descriptor fd as  an  epoll  instance  will
              likewise fail.  The error in all of these cases is EINVAL.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

       When  successful,  epoll_ctl()  returns zero.  When an error occurs, epoll_ctl()  returns -1 and errno is
       set to indicate the error.

ОШИБКИ

       EBADF  Значение epfd или fd не является правильным файловым дескриптором.

       EEXIST Значение op равно EPOLL_CTL_ADD, и указанный файловый дескриптор fd уже зарегистрирован  в  данном
              экземпляре epoll.

       EINVAL Значение  epfd  не  является  файловым  дескриптором  epoll,  или  значение  fd  равно  epfd,  или
              запрашиваемая операция op не поддерживается данным интерфейсом.

       EINVAL Указан недопустимый тип события, так как в events установлен EPOLLEXCLUSIVE.

       EINVAL Значение op равно EPOLL_CTL_MOD и events содержит EPOLLEXCLUSIVE.

       EINVAL op was EPOLL_CTL_MOD and the EPOLLEXCLUSIVE flag has previously  been  applied  to  this  epfd, fd
              pair.

       EINVAL Флаг EPOLLEXCLUSIVE указан в event и fd ссылается на экземпляр epoll.

       ELOOP  fd refers to an epoll instance and this EPOLL_CTL_ADD operation would result in a circular loop of
              epoll instances monitoring one another or a nesting depth of epoll instances greater than 5.

       ENOENT В  op  было  указано  EPOLL_CTL_MOD  или  EPOLL_CTL_DEL,  а  fd  не было зарегистрировано в данном
              экземпляре epoll.

       ENOMEM Недостаточно памяти для обработки запрошенной управляющей операции op.

       ENOSPC При попытке регистрации  (EPOLL_CTL_ADD)  нового  файлового  дескриптора  в  экземпляре  достигнут
              предел, накладываемый /proc/sys/fs/epoll/max_user_watches. Подробней см. в epoll(7).

       EPERM  Файл  назначения  fd  не  поддерживает  epoll.  Эта ошибка может возникнуть, если fd ссылается на,
              например, обычный файл или каталог.

СТАНДАРТЫ

       Linux.

ИСТОРИЯ

       Linux 2.6, glibc 2.3.2.

ПРИМЕЧАНИЯ

       Интерфейс epoll поддерживает все файловые дескрипторы, которые поддерживает poll(2).

ОШИБКИ

       Before Linux 2.6.9, the EPOLL_CTL_DEL operation required a non-null pointer in event,  even  though  this
       argument  is  ignored.   Since  Linux  2.6.9,  event  can  be specified as NULL when using EPOLL_CTL_DEL.
       Applications that need to be portable to kernels before Linux 2.6.9 should specify a non-null pointer  in
       event.

       Если  в  flags  указан EPOLLWAKEUP, но вызывающий не имеет мандата CAP_BLOCK_SUSPEND, то флаг EPOLLWAKEUP
       просто игнорируется. Такое неуместное поведение  необходимо,  так  как  в  первоначальной  реализации  не
       выполнялась  проверка  корректности аргумента flags, и добавление EPOLLWAKEUP с проверкой того, что вызов
       завершился с ошибкой, если вызывающий не имеет мандата CAP_BLOCK_SUSPEND, привело  к  поломке  не  одного
       существующего   пользовательского  приложения,  которое  произвольно  устанавливало  (и  зря)  этот  бит.
       Корректное приложение  должно  дважды  проверить,  что  имеет  мандат  CAP_BLOCK_SUSPEND,  если  пытается
       использовать флаг EPOLLWAKEUP.

СМОТРИТЕ ТАКЖЕ

       epoll_create(2), epoll_wait(2), ioctl_eventpoll(2), poll(2), epoll(7)

ПЕРЕВОД

       Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Yuri
       Kozlov <yuray@komyakino.ru>, Иван Павлов <pavia00@gmail.com> и Kirill Rekhov <krekhov.dev@gmail.com>

       Этот  перевод является свободной программной документацией; он распространяется на условиях общедоступной
       лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html  версии  3  или
       более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

       Если  вы  обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом
       разработчику(ам)  по  его(их)  адресу(ам)  электронной  почты  или  по   адресу   списка рассылки русских
       переводчиков.

Справочные страницы Linux 6.9.1                  12 июня 2024 г.                                    epoll_ctl(2)