man select
バグ
Linux では、select() がソケット ファイル記述子を「読み取り準備完了」と報告する場合がありますが、その後の読み取りはブロックされます。これは、たとえば、データが到着したが、検査時に間違ったチェックサムがあり、破棄された場合に発生する可能性があります。ファイル記述子が誤って準備完了と報告される状況が他にもある可能性があります。したがって、
ブロックしてはならないソケットでは O_NONBLOCK を使用する方が安全かもしれません。
しかしnetcat
、、、(しかし、ではありませんsocat
)O_NONBLOCKなしでFDを選択またはポーリングするように設定しています。wget
curl
これについてアプリをテストするための特別なライブラリを実装しましたが、失敗しています...
wget
/* 古くなったソケットからハングアップしread
、本来のようにタイムアウトしないことに触発されました*/
これをバグとして報告する必要がありますか、それとも彼らはそれを正しく行っていますか?
考えられる答え:
- "いいえ、poll/select で FD をブロックする => バグ";
- 「AF_INET[6] ソケットのみが選択時に誤作動する可能性があるため、ブロックしているネットワーク ソケットが poll/select にある場合にのみバグが発生します」;
- 「はい、これが原因で実際に障害が発生した場合にのみバグを報告してください」(wgetのように)。