#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
они почти всегда будут запускаться немедленно, поскольку сокет всегда готов к записи, если вы не напишете так много, что заполните буфер сокета ядра.