7 Stimmen

Sollte ich bei der Verwendung von flankengesteuertem Epoll eine Schleife über das Senden legen?

Ich verwende epoll, um einen Medienserver zu schreiben. Die fds sind alle auf non-blocking eingestellt und ich verwende Edge-getriggerte Ereignisse. Ich weiß, dass ich für EPOLLIN eine Schleife über das Lesen der fd machen muss, bis EAGAIN zurückgegeben wird. Aber was ist mit dem Schreiben?

Wenn ich schreiben will, stelle ich die Daten in eine Warteschlange und setze EPOLLOUT|EPOLLIN|EPOLLET auf die fd. Wenn das EPOLLOUT-Ereignis eintritt, schreibe ich den gesamten in der Warteschlange stehenden Puffer in einem Zug:

n = send ( fd, buf, buf_len, MSG_NOSIGNAL );

Wenn n > 0 && n < buf_len, setze ich einfach EPOLLOUT zurück und komme zurück. Ich sehe keinen Sinn darin, eine Schleife über send zu ziehen (was die Manpage für epoll meiner Meinung nach impliziert). Es scheint, als ob send angedeutet hat, dass es gerade alles aufgenommen hat, was es kann, und EAGAIN zurückgibt, wenn es sofort aufgerufen wird.

Ist die Beseitigung eines Systemaufrufs hier der effizienteste Weg?

5voto

user666412 Punkte 508

Epoll man page sagt:

Bei stromorientierten Dateien (z. B. Pipe, FIFO, Stream-Socket) kann der Zustand, dass der Lese-/Schreib-E/A-Speicherplatz erschöpft ist, auch durch Überprüfung der Datenmenge, die aus dem Zieldateideskriptor gelesen bzw. in ihn geschrieben wurde, festgestellt werden. Wenn Sie zum Beispiel read(2) aufrufen, um eine bestimmte Datenmenge zu lesen, und read(2) eine geringere Anzahl von Bytes zurückgibt, können Sie sicher sein, dass der E/A-Lesebereich für den Dateideskriptor ausgeschöpft ist. Das Gleiche gilt für das Schreiben mit write(2). (Vermeiden Sie diese letztere Technik, wenn Sie nicht garantieren können, dass der überwachte Dateideskriptor immer auf eine stream-orientierte Datei verweist).

0voto

user652276 Punkte 17

Ich habe eine Reihe von Tests durchgeführt, und es scheint, dass die Schleifenbildung beim Senden eine Zeitverschwendung ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X