私はLinuxとWindowsのC言語で実装されているシンプルなソケットサーバを持っていて、それをきちんとシャットダウンできません。selectでサーバソケットを検出しています
ソケットを作成し、バインドしてから呼び出します。次に、selectを使用して新しい接続を検出し、現在接続されているクライアントソケットの読み取りアクティビティをループします。ソケットをクローズしているクライアントはうまくいきます。それがセレクトアップを呼び起こし、問題が発生しているビットがきれいにループをクローズしています。 Naiveは、別のスレッドから、またはシグナルやCtrl-Cに応答して、サーバーソケット(私がリッスンして受け入れているソケット)を閉じていましたが、これは選択を呼び起こすことに失敗しました。
自己パイプトリックを使用して、必要に応じて選択を待つことができます(FIFOを作成し、選択リストに読み込み終了を含め、シャットダウンしたいときに書き込みます)。コードの構造を考えれば非常に便利です。 サーバーソケットを閉じるときに私の選択が目を覚ますことが期待されるかどうか、これが期待された動作かどうかは疑問でした。これはWindows上でこのように動作します。
ありがとうございました。
リスニングソケットがselect fdのread fdセットにありますか? – Pras
グローバル変数を配置し、pthread_killを使ってselectスレッドに信号を送ることはできますか? –