2012-03-24 6 views
1

Ich benutze Epoll, um große Nachrichten an einen Server mit HTTP-Protokoll zu schreiben. Die FDS sind alle auf nicht blockierend eingestellt und ich verwende flankengetriggerte Ereignisse. Ich weiß für EPOLLIN ich muss Schleife über das Lesen der Fd, bis EAGAIN zurückgegeben wird. Zum Schreiben bin ich unsicher, ob ich weitermachen soll, sobald ich EAGAIN bekomme, oder ob ich warten soll, bis epoll benachrichtigt, wenn das fd wieder verfügbar ist.epoll Verhalten beim Schreiben in einen Dateideskriptor

Zum Beispiel schreibe ich eine 20K-Nachricht, und beim ersten :: write Versuch die Menge der gesendeten Daten = 13K. Der nächste Schreibversuch liefert retVal = -1 und errno = EAGAIN.

An dieser Stelle sollte ich eine Weile weiterschleifen (1), bis ich die Daten schreiben kann oder sollte ich warten, dass Epoll meinen Aufruf zurück ruft, wenn die FD wieder zum Schreiben bereit ist. Mein Verständnis ist, dass, da die FD zum Schreiben registriert ist, Epoll mich benachrichtigen sollte, wenn die FD wieder zum Schreiben bereit ist. Aber das scheint in meinem Programm nicht zu passieren.

Muss ich ein spezielles Flag setzen oder die FD ändern, um die Benachrichtigung zu erhalten?

Antwort

4

An dieser Stelle sollte ich in eine Weile weiter Looping (1), bis ich die Daten

Nein schreiben kann!

oder sollte ich warten, bis epoll meinen Rückruf aufruft, wenn das FD wieder zum Schreiben bereit ist.

Ja, Sie sollten (aber was Rückruf? epoll_wait kein Rückrufmechanismus haben, es gibt nur)

Mein Verständnis ist, dass, da der fd zum Schreiben registriert ist, epoll mich zu unterrichten, falls wenn die FD wieder zum Schreiben bereit ist. Aber das scheint in meinem Programm nicht zu passieren.

Wenn die FD mit EPOLLOUT oder EPOLLIN | EPOLLOUT registriert ist, sollte es in der Tat. Können Sie ein kleines Beispiel für das Problem angeben?

+0

James, danke für die Antwort. Ich hatte einen Fehler im Code - deshalb erhielt ich keine EPOLLET-Ereignisse auf dem fd, sobald es wieder zum Schreiben verfügbar war. Es funktioniert jetzt wie erwartet. – user1290156

Verwandte Themen