Frage

Meine Anwendung wird riesige Menge an Daten über das Netzwerk schicken, also entschied ich mich (weil ich bin mit Linux) zur Verwendung epoll und Spleiß. Hier ist, wie ich es sehe (Pseudo-Code):

epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
while(1)
{
    epoll_wait (tmp_structure);

    if (tmp_structure->fd == file_descriptor)
    {
        epoll_ctl (file_fd, EPOLL_CTL_DEL); 
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_ADD); // wait for EPOLLOUT event
    }

    if (tmp_structure->fd == tcp_socket_descriptor)
    {
        splice (file_fd, tcp_socket_fd);
        epoll_ctl (tcp_socket_fd, EPOLL_CTL_DEL); 
        epoll_ctl (file_fd, EPOLL_CTL_ADD); // waiting for EPOLLIN event
    }
}

Ich gehe davon aus, dass meine Anwendung bis zu 2000 TCP-Sockets öffnen. Ich möchte o fragen Sie zwei Dinge:

  1. Es wird eine ganze Reihe von epoll_ctl Anrufe werden Witz nicht langsam sein, wenn ich so viele Steckdosen haben?
  2. File Descriptor hat geworden lesbar erste, und es wird einige Intervall sein, bevor Buchse beschreibbar zu machen. Kann ich sicher sein, dass in dem Moment, wenn Buchse beschreibbaren Dateideskriptor wird noch lesbar ist (Sperr Aufruf zu vermeiden)?
War es hilfreich?

Lösung

1. Frage

  1. Sie können mit flankengetriggert eher dann selbst ausgelöst Polling so haben Sie nicht zu löschen Buchse jedes Mal.
  2. Sie können EPOLLONESHOT verwenden, um zu verhindern Steckdose zu ziehen

Datei-Beschreiber hat lesbar werden erste, und es wird einige Intervall sein, bevor Buchse beschreibbar sein wird.

Welche Art von Dateideskriptor? Wenn diese Datei im Dateisystem können Sie nicht verwenden / poll oder andere Werkzeuge für diesen Zweck wird Datei immer lesbar oder beschreibbar unabhängig den Zustand, wenn die Platten- und Cache. Wenn Sie Mitarbeiter tun müssen asynchrone Sie aio_* API aber in der Regel nur lesen aus einer Datei Schreiben in Datei verwenden können und davon ausgehen, es ist nicht blockierend.

Wenn es TCP-Socket ist, dann wäre es die meiste Zeit sein beschreibbar. Es ist besser zu nutzen nicht blockierende Anrufe und setzen Sockets epoll wenn Sie EWOULDBLOCK erhalten.

Andere Tipps

Betrachten EPOLLET Flag verwendet. Dies ist auf jeden Fall für diesen Fall. Wenn dieser Flag verwenden, können Sie Ereignisschleife in geeigneter Weise ohne Deregistrierung (oder Modifizieren-Modus aktiviert) Filedeskriptoren seit dem ersten Anmeldung in epoll verwenden. :) genießen!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top