は私がsocket()
+ POLLINpoll()
+ recv()
+ send()
で小さなTCPサーバを書いたが、書き込み可能なイベントをポーリングするwritefds
をPOLLOUTポーリングを使用するか選択するようにするとき、私は知りません。ポールC関数のPOLLOUTイベントをいつ使用するのですか?
誰でも私に実際の使用例を教えてくださいPOLLOUT?
は私がsocket()
+ POLLINpoll()
+ recv()
+ send()
で小さなTCPサーバを書いたが、書き込み可能なイベントをポーリングするwritefds
をPOLLOUTポーリングを使用するか選択するようにするとき、私は知りません。ポールC関数のPOLLOUTイベントをいつ使用するのですか?
誰でも私に実際の使用例を教えてくださいPOLLOUT?
いつものパターンは、このようなpoll()
と非ブロックファイル記述子を使用することです:あなたはいつも何他を読んで興味を持っているので、poll()
への準備をするとき
POLLIN
を設定しましたソケットの端があなたを送ります。
POLLOUT
は、相手側に送信する未処理データがある場合にのみ設定します。 poll()
から戻るとpoll()
から戻ると、それPOLLOUT
次の時間を設定するために、残りを維持するつもりはありません後で。ループの次回にはPOLLOUT
を設定します。熱心にそれのいくつかを送信しよう
POLLOUT
を設定します。POLLOUT
に設定してください。 (この選択は、ループ内のある場所にデータを書き込むだけで済むため、プログラムを作成する方が簡単ですが、ループの次回まではデータを書き込むのが遅れます。nginxのソースから)、私がことがわかった:送信するためにいくつかのデータがある場合は、nginxのは、システムコール(多分writev)でそれを送信しようと
。しかし、nginxが一度に合計データを送信できない場合、ポーリングイベントを使用している場合はpollfdにPOLLOUTを設定して、書き込み可能なイベントを待機します。書き込み可能なイベントを取得すると、nginxは左のデータを送信します。
nginxが大きな静的ファイルに応答しようとすると、このケースを再現するのは簡単です
通常は安全な方法ではありません。 ) – Shawn
@Shawn、なぜPOLLOUTは安全でないのですか? – xiaochen
の[select()ステートメントの "fd_set * writefds"パラメータを使用する理由(http://stackoverflow.com/questions/7076320/what-to-use-the-fd-set-writefds-詳細なフロー記述については、 –