select() は FD を読み取ることができるとマークしますが、読み取れるデータはありません。

select() は FD を読み取ることができるとマークしますが、読み取れるデータはありません。

accept()私のサーバーコードで受信ソケットへの呼び出しが読み取り可能であるとマークされているにもかかわらず、時々ブロックされる問題が発生しました。select()私の理解は、これが頻繁に起こってはならないということです。しかし、ソケットが「読み取り可能」であるときにデータを使用できるというPOSIX標準保証があるかどうかはわかりません。私は現在私のコードのロジックにバグがあるかどうかを調べています。しかし、この種の問題の経験があり、これらの問題が発生するには、どのような状況が発生するのかを知っている人がいるかどうか疑問に思います。ありがとうございます。

答え1

これは正しい動作です。 a後で操作を実行すると、接続がイニシエータによって終了されたか、他の承認プロセスによって占有されている可能性があるため、accept()接続がまだ承認キューにあるかどうかを確認できません。select()からman 2 accept

SIGIO または select(2)、転送または読みやすさイベントを返した後、呼び出し前に非同期ネットワークエラーまたは他のスレッドによって接続が削除された可能性があるため、接続がpoll(2)常に待機するわけではありません。これが発生すると、次の接続が到着するのを待って呼び出しがブロックされます。ブロックしないようにするには、渡されたソケットにフラグセットが必要です(参考文献を参照)。epoll(7)accept()accept()sockfdO_NONBLOCKsocket(7)

関連情報