Эполл с событием, вызванным краем
Справочная страницаEpoll имеет пример кода для фронта, срабатывающего следующим образом:
for (;;) {
nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_pwait");
exit(EXIT_FAILURE);
}
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listen_sock) {
conn_sock = accept(listen_sock,
(struct sockaddr *) &local, &addrlen);
if (conn_sock == -1) {
perror("accept");
exit(EXIT_FAILURE);
}
setnonblocking(conn_sock);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock,
&ev) == -1) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
do_use_fd(events[n].data.fd);
}
}
}
В функции do_use_fd я вызываю неблокированный recv в цикле while до EAGAIN, пример кода работает нормально.
У меня есть вопрос по поводу этого примера кода, предположим, что теперь у меня есть 50 подключений клиентов сокетов, внезапно 10 клиентов записывают данные одновременно, поэтому epoll_wait () вернет 10 и затем перейдет к циклу:
for (n = 0; n < nfds; ++n)
это позвонитdo_use_fd(events[n].data.fd);
для этих 10 клиентов, предположим, что n = 5 выполнено, а n = 6 еще не завершено, внезапно описание файла события n = 3 получит новые данные, после того как все эти 10 событий будут выполнены, и я вернусь к epoll_wait. получить событие сообщить мне, что у клиента есть новые данные для чтения? или я пропущу это, потому что когда событие произошло, код не в epoll_wait !!