Возвращает ли epoll_wait() события по одному за раз?

#c #sockets #asynchronous #epoll

#c #сокеты #асинхронный #epoll

Вопрос:

Допустим, я добавляю сокет в epoll, ожидая событий EPOLLIN и EPOLLOUT, что-то вроде этого:

 struct epoll_event event;
event.events = EPOLLIN | EPOLLOUT;
epoll_ctl(epfd, EPOLL_CTL_ADD, socket, amp;event);
 

Если сокет становится доступным для чтения и записи, нужно ли мне вызывать epoll_wait() дважды, чтобы получить оба события, или он вернет одно epoll_event с установленными обоими битовыми полями? (Предполагается epoll_wait() , что вызывается с maxevents значением 1.)

Комментарии:

1. Вы рассматривали возможность чтения документации для epoll_wait() ? Если вы не понимаете документы, мы можем уточнить, но в этом случае, пожалуйста, укажите, какую часть вы не понимаете.

2. Когда я задавал вопрос, я прочитал справочную страницу, но не был уверен, были ли возвращены несколько событий в виде нескольких структур или нескольких событий в одном epoll_event .

Ответ №1:

В документации epoll_wait() говорится:

Поле события представляет собой битовую маску, которая указывает события, произошедшие для соответствующего описания открытого файла.

Множественное число «события» подразумевает, что для одного и того же дескриптора может произойти несколько событий.

Я считаю maxevents , что аргумент to epoll_wait() фактически указывает максимальное количество элементов в events массиве — если в одном FD происходит несколько событий, все они находятся в одном элементе.

Обратите внимание, что если вы используете события, инициируемые уровнем (по умолчанию), EPOLLOUT они почти всегда будут запускаться немедленно, поскольку сокет всегда готов к записи, если вы не напишете так много, что заполните буфер сокета ядра.