私はepollを使用してメディアサーバーを作成しています。fdsはすべて非ブロッキングに設定されており、エッジトリガーイベントを使用しています。EPOLLINの場合、EAGAINが返されるまでfdの読み取りをループする必要があることを知っています。しかし、書くことはどうですか?
書き込みたいときは、データをキューに入れ、fdにEPOLLOUT | EPOLLIN|EPOLLETを設定します。EPOLLOUTイベントが発生すると、キューに入れられたバッファー全体を1回のショットで書き込みます。
n = send ( fd, buf, buf_len, MSG_NOSIGNAL );
n> 0 && n <buf_lenの場合、EPOLLOUTをリセットして戻ります。sendをループする意味がわかりません(epollのmanページが暗示していると思います)。sendは、可能な限りすべてを取り込んだことを示しているようで、すぐに呼び出された場合はEAGAINを返します。
ここでシステムコールを排除することが最も効率的なルートですか?