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?