socket()
+ POLLIN poll()
+ recv()
+を使用して小さな TCP サーバーを作成しましたが、いつPOLLOUTポーリングを使用するか、書き込み可能なイベントでポーリングするように選択するsend()
かがわかりません。writefds
POLLOUTの実際の使用例を教えてもらえますか?
poll()
通常のパターンは、次のようにノンブロッキング ファイル記述子を使用することです。
poll()
、
POLLIN
してください。
POLLOUT
相手側に送信する未処理のデータがある場合にのみ設定します。poll()
、データが読み取り可能であることが示されている場合は、
poll()
、ソケットが書き込み可能であることを示している場合は、
POLLOUT
次はループで設定しませんPOLLOUT
次回はループで設定します。POLLOUT
残っている場合にのみループを介して次回に設定する予定です。POLLOUT
、ループを介して次回の設定を計画してください。(この選択は、多くの場合、ループ内の 1 か所でデータの書き込みを処理するだけでよいため、プログラミングが簡単ですが、その一方で、次回のループまでデータの書き込みを遅らせます。)nginx ソースから、次のことがわかりました。
送信するデータがある場合、nginx はシステムコール (おそらく writev) で送信しようとします。ただし、nginx が一度に合計データを送信できない場合、pollfd で POLLOUT を設定し、poll イベントを使用している場合は、書き込み可能なイベントを待機します。書き込み可能なイベントを取得すると、nginx は左のデータを送信します。
nginx が大きな静的ファイルに応答しようとすると、このケースを簡単に再現できます。