select(2)
ループ (読み取りの選択) によって制御される、キープアライブ (間隔 1 分) の TCP ソケットのセットがあります。
select(2)
セット内のソケットの 1 つでキープアライブ タイムアウトが発生した場合、エラーを返しますか?- どのエラーが
read(2)
返されますか?
select()
選択しているソケットの 1 つに対してエラーが通知された場合、それ自体はエラーを返しません。[実際、API はこの方法でソケットごとのエラーを示すことはできません。これは、select()
. どっちがselect()
返す?】select()
、代わりに FD_ISSET マクロを使用して、read()
読み取り可能とマークされた各ソケットで試行します。select()
返され、キープアライブによるタイムアウト エラーをすぐに拾うことができます。ソケットを読み取り用にマークする select は、読み取るデータがあることを示すのではなく、読み取りの試みがブロックされないことのみを示すことに注意してください。取得する保留中のエラーがソケットにある場合、読み取りはブロックされません。と の両方が、データの処理を試みる前に、ソケットで保留中のエラーを取得しますread(2)
。write(2)
O_NONBLOCK がクリアされた入力関数の呼び出しがブロックされない場合、関数がデータを正常に転送するかどうかにかかわらず、記述子は読み取りの準備ができていると見なされます。(関数は、データ、ファイルの終わりの表示、またはブロックされていることを示すもの以外のエラーを返す可能性があり、これらのそれぞれの場合、記述子は読み取りの準備ができていると見なされます。) [ POSIX:select() ]
ETIMEDOUT
もう一方の端が完全に消えれば取得できます。パケット配信エラーが発生した場合は、代わりにそれを取得します (そのため、キープアライブ パケットが「ホストに到達できません」などの ICMP エラー応答を取得した場合、EHOSTUNREACH
配信済みになります)。[これらのケースの詳細については、Stevens の「Unix Network Programming, vol 1」を参照してください。]select()
FDSET
どのソケットがトリガーされたかを示すビットを に設定します。FD_ISSETマクロを使用して、どのソケットがサービスを要求したかを判別します。