epoll z wydarzeniem wyzwalanym przez krawędź

Strona podręcznikaepoll ma przykładowy kod dla krawędzi wyzwalany w następujący sposób:

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);
        }
    }
}

W funkcji do_use_fd, wywołuję nonblocked recv w pętli while, aż EAGAIN, przykładowy kod działa poprawnie.

Mam pytanie dotyczące tego przykładowego kodu, załóżmy, że teraz mam 50 połączeń klientów gniazd, nagle 10 klientów zapisuje dane w tym samym czasie, więc epoll_wait () zwróci 10, a następnie przejdzie do pętli for:

for (n = 0; n < nfds; ++n)

zadzwonido_use_fd(events[n].data.fd); dla tych 10 klientów załóżmy, że n = 5 jest zakończone, a n = 6 jeszcze się nie skończyło, nagle opis pliku zdarzenia n = 3 otrzymał nowe dane, po tym jak wszystkie te 10 zdarzeń zostaną wykonane iz powrotem do epoll_wait, czy uzyskać zdarzenie informujące mnie, że klient ma nowe dane do przeczytania? albo będę tęsknić, ponieważ gdy wydarzy się zdarzenie, kod nie będzie w epoll_wait !!

questionAnswers(2)

yourAnswerToTheQuestion