7

私は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を返します。

ここでシステムコールを排除することが最も効率的なルートですか?

4

2 に答える 2

5

epollのmanページには次のように書かれています。

ストリーム指向のファイル(パイプ、FIFO、ストリームソケットなど)の場合、ターゲットファイル記述子からの読み取り/書き込みデータの量をチェックすることで、読み取り/書き込みI/Oスペースが使い果たされている状態を検出することもできます。 たとえば、特定の量のデータの読み取りを要求してread(2)を呼び出し、read(2)が返すバイト数が少ない場合、ファイル記述子の読み取りI/Oスペースを使い果たしたことを確認できます。write(2)を使用して書き込む場合も同様です。 (監視対象のファイル記述子が常にストリーム指向のファイルを参照することを保証できない場合は、この後者の手法を避けてください。)

于 2012-02-23T16:33:48.203 に答える
0

私はたくさんのテストを行いましたが、送信のループは時間の無駄のようです。

于 2011-07-07T17:23:05.943 に答える