ポーリングがこれらのビットを設定したときに何をすべきか疑問に思っていますか? ソケットを閉じるか、無視しますか?
4 に答える
APOLLHUP
は、ソケットが接続されていないことを意味します。TCP では、これは FIN が送受信されたことを意味します。
APOLLERR
は、ソケットで非同期エラーが発生したことを意味します。TCP では、これは通常、RST が受信または送信されたことを意味します。ファイル記述子がソケットでない場合POLLERR
、デバイスがポーリングをサポートしていない可能性があります。
上記の両方の条件で、ソケット ファイル記述子はまだ開いており、まだ閉じられていません (ただし、shutdown()
既に呼び出されている可能性があります)。ファイル記述子の Aclose()
は、ソケットに代わってまだ予約されているリソースを解放します。理論的には、ソケットをすぐに再利用できるはずです (たとえば、別のconnect()
呼び出しで)。
APOLLNVAL
は、ソケット ファイル記述子が開いていないことを意味します。それはそれでエラーにclose()
なります。
それは正確なエラーの性質に依存します。getsockopt() を使用して問題を確認します。
int error = 0;
socklen_t errlen = sizeof(error);
getsockopt(fd, SOL_SOCKET, SO_ERROR, (void *)&error, &errlen);
値: http://www.xinotes.net/notes/note/1793/
最も簡単な方法は、ソケットがいずれにしても使用できなくなったと想定して閉じることです。
POLLNVAL
ファイル記述子の値が無効であることを意味します。これは通常、プログラムのエラーを示しますが、ファイル記述子を閉じており、それ以降、記述子を再利用した可能性のあるファイルを開いていない場合は、poll
戻ることに依存できます。POLLNVAL
POLLERR
のエラー イベントに似ていますselect
。read
orwrite
呼び出しがエラー状態 (I/O エラーなど) を返すことを示します。これには、マスクを介して通知する帯域外データは含まれませんが、 をselect
介して通知されます。errorfds
poll
POLLPRI
POLLHUP
基本的に、接続のもう一方の端にあるものが接続の端を閉じたことを意味します。POSIX では次のように説明されています。
デバイスが切断されました。このイベントと POLLOUT は相互に排他的です。ハングアップが発生した場合、ストリームを書き込み可能にすることはできません。
これは端末にとって十分明らかです: 端末がなくなった (SIGHUP を生成する同じイベント: モデム セッションが終了した、端末エミュレータ ウィンドウが閉じられたなど)。POLLHUP
通常のファイルに対して送信されることはありません。パイプとソケットの場合は、オペレーティング システムによって異なります。Linux はPOLLHUP
、パイプの書き込み側のプログラムがパイプを閉じたPOLLIN|POLLHUP
ときに設定し、ソケットのもう一方の端がソケットを閉じたときに設定しますがPOLLIN
、ソケットのシャットダウンの場合のみです。最近の *BSDPOLLIN|POLLUP
は、パイプの書き込み側がパイプを閉じるときに設定され、ソケットの動作はより可変的です。