21

ポーリングがこれらのビットを設定したときに何をすべきか疑問に思っていますか? ソケットを閉じるか、無視しますか?

4

4 に答える 4

25

APOLLHUPは、ソケットが接続されていないことを意味します。TCP では、これは FIN が送受信されたことを意味します。

APOLLERRは、ソケットで非同期エラーが発生したことを意味します。TCP では、これは通常、RST が受信または送信されたことを意味します。ファイル記述子がソケットでない場合POLLERR、デバイスがポーリングをサポートしていない可能性があります。

上記の両方の条件で、ソケット ファイル記述子はまだ開いており、まだ閉じられていません (ただし、shutdown()既に呼び出されている可能性があります)。ファイル記述子の Aclose()は、ソケットに代わってまだ予約されているリソースを解放します。理論的には、ソケットをすぐに再利用できるはずです (たとえば、別のconnect()呼び出しで)。

APOLLNVALは、ソケット ファイル記述子が開いていないことを意味します。それはそれでエラーにclose()なります。

于 2014-07-16T22:23:13.843 に答える
11

それは正確なエラーの性質に依存します。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/

最も簡単な方法は、ソケットがいずれにしても使用できなくなったと想定して閉じることです。

于 2014-07-16T22:17:19.877 に答える
5

POLLNVALファイル記述子の値が無効であることを意味します。これは通常、プログラムのエラーを示しますが、ファイル記述子を閉じており、それ以降、記述子を再利用した可能性のあるファイルを開いていない場合は、poll戻ることに依存できます。POLLNVAL

POLLERRのエラー イベントに似ていますselectreadorwrite呼び出しがエラー状態 (I/O エラーなど) を返すことを示します。これには、マスクを介して通知する帯域外データは含まれませんが、 をselect介して通知されます。errorfdspollPOLLPRI

POLLHUP基本的に、接続のもう一方の端にあるものが接続の端を閉じたことを意味します。POSIX では次のように説明されています。

デバイスが切断されました。このイベントと POLLOUT は相互に排他的です。ハングアップが発生した場合、ストリームを書き込み可能にすることはできません。

これは端末にとって十分明らかです: 端末がなくなった (SIGHUP を生成する同じイベント: モデム セッションが終了した、端末エミュレータ ウィンドウが閉じられたなど)。POLLHUP通常のファイルに対して送信されることはありません。パイプとソケットの場合は、オペレーティング システムによって異なります。Linux はPOLLHUP、パイプの書き込み側のプログラムがパイプを閉じたPOLLIN|POLLHUPときに設定し、ソケットのもう一方の端がソケットを閉じたときに設定しますがPOLLIN、ソケットのシャットダウンの場合のみです。最近の *BSDPOLLIN|POLLUPは、パイプの書き込み側がパイプを閉じるときに設定され、ソケットの動作はより可変的です。

于 2014-08-11T18:26:26.513 に答える