2012-03-24 17 views
1

私はepollを使ってHTTPプロトコルを使って大きなメッセージをサーバに書き出しています。 fdsはすべて非ブロッキングに設定されており、エッジトリガーイベントを使用しています。私はEPOLLINを知っています。私はEAGAINが返されるまでfdを読み返す必要があります。私がEAGAINを取得したらループする必要があるかどうかわかりません。また、fdが読み込み可能になったときにepollが通知するのを待つ必要があります。ファイル記述子に書き込む際のepollの動作

たとえば、私は20Kのメッセージを書いています。最初の書き込みでは、送信されたデータの量は13Kです。次の書き込み要求は、retVal = -1とerrno = EAGAINを返します。

この時点で、私はデータを書き込むことができるまで私はwhileループ(1)を続けるべきですか、FDが再び書き込みの準備ができたときにepollが呼び出しを呼び出すのを待つべきですか?私の理解は、fdが書込みのために登録されているので、epollはFDが書込みの準備ができたら通知するはずです。しかし、それは私のプログラムでは起こっていないようです。

通知を受け取るために特殊なフラグを設定するか、FDを変更する必要がありますか?この時点で

答えて

4

は、私はしばらくの間でループ(1)私はデータなし

を書くことができるまで継続すべきです!

また、FDが書き換えの準備ができているときにepollがコールバックを呼び出すのを待つべきですか?

はい、あなたは

私の理解では、FDが書き込みのために登録されているので、ファイルディスクリプタは私を通知しなければならないことである(ただし、コールバック機構を持っていないどのようなコールバック?epoll_wait、それだけを返す)必要がありますFDが再び書き込みを行う準備ができているとき。しかし、それは私のプログラムでは起こっていないようです。

FDがEPOLLOUTまたはEPOLLIN | EPOLLOUTに登録されている場合、それは確かにする必要があります。問題を示す小さな例を教えてください。

+0

James、返信いただきありがとうございます。私はコードにバグがありました。そのため、再び書き込みが可能になると、私はfdでEPOLLETイベントを受け取っていませんでした。今は期待どおりに動作します。 – user1290156

関連する問題