Продолжают приходить EPOLLIN после EAGAIN. Почему такое может происходить?
Схема кода:
while(f_work) {
// нам нужен бесконечный цикл ожидания (-1)
int nfds = epoll_wait(epfd, events, MAX_EVENTS, EPOLL_RUN_TIMEOUT);
if (nfds == -1) {
perror("epoll_wait()");
}
else /* for */
for (int i = 0; i < nfds; i++) {
int fd = events[i].data.fd;
if (fd == listener) {
...
ev.events = EPOLLIN; // not EPOLLET
ev.data.fd = s;
if (epoll_ctl(epfd, EPOLL_CTL_ADD, s, &ev) == ENOSPC) {
printf("Error: epoll_ctl(ADD,)\n");
goto failure;
}
}
else {
// in level-triggered interface, for available data
// an error has occured
if ((events[i].events & EPOLLERR) ||
(events[i].events & EPOLLHUP) ||
(!(events[i].events & EPOLLIN))) {
printf("epoll error\n");
close(fd);
continue;
}
uint8_t rdbuf[RDBUF_SIZE];
ssize_t read_bytes = recv(fd, &rdbuf, RDBUF_SIZE, 0); // .. len, flags = 0
}
}
}