Epoll mit Edge-Triggered Event

Die Manpage vonepoll hat einen Beispielcode für die Flanke wie folgt ausgelöst:

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

In der Funktion do_use_fd rufe ich die nicht blockierte recv in while-Schleife auf, bis EAGAIN, der Beispielcode funktioniert.

Ich habe eine Frage zu diesem Beispielcode. Angenommen, ich habe jetzt 50 Socket-Client-Verbindungen. Plötzlich schreiben 10 Clients gleichzeitig Daten. Epoll_wait () gibt 10 zurück und geht dann zur for-Schleife:

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

es wird anrufendo_use_fd(events[n].data.fd); Nehmen wir für diese 10 Clients an, n = 5 ist fertig und n = 6 ist noch nicht fertig. Plötzlich hat die Dateibeschreibung des Ereignisses n = 3 neue Daten erhalten, nachdem alle diese 10 Ereignisse fertig sind, und zurück zu epoll_wait, werde ich bekomme ich die eventmeldung, dass ein client neue daten zu lesen hat? oder ich werde es vermissen, weil wenn Ereignis passiert ist, der Code nicht in epoll_wait !!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage