シグナルハンドラーでソケットを閉じる方法
質問
Ctrl-Cが押されるまで永久にループする非常にシンプルなサーバーを書いています。 ctrl-cのシグナルハンドラーで開いているソケットを閉じてサーバーをシャットダウンしたいのですが、シグナルハンドラーのスコープがわからないため、ソケットを宣言するという考えが気に入らない(s)私はグローバルになりたいと思う必要があります。
誰かが提案を提供できますか?これを行うための標準的な方法はありますか?
解決
まあ、あなたはシグナルハンドラを持っているので、あなたはUnixの亜種を使用していると仮定します。その場合:
- ソケットは、ファイル番号(int)によってカーネルに対して識別されます。
socket(2)
を参照してください。 - そのintはプロセスに有効です
- そのintは、作成後に分岐されたプロセスに対して有効です
- close-on-execでない場合、実行するすべてのプロセスで有効です。
つまり、シグナルハンドラーでは完全に有効です。どの番号を使用するかをシグナルハンドラーに認識させる方法は、指定しなかった記述言語によって異なります。ほとんどすべての言語で機能する2つのアプローチがあります
-
close
およびexit以外に実行するクリーンアップがない場合は、exitを呼び出します。または、シグナルアクションをデフォルトのexitに設定します。カーネルはソケットを閉じます。 - フラグ(通常は何らかのグローバル)を設定して、選択/ポーリングループをクリーンアップして終了するように指示します。プログラムのさまざまな部分がシグナルハンドラから安全に呼び出せるかどうかを心配する必要がないという利点があります。
他のヒント
通常、シグナルハンドラーでは何もしないことをお勧めします。フラグを設定する以外。
その後、制御がメインループに戻ると、このフラグを調べ、ループを終了し、ソケットを閉じ、オブジェクトでデストラクタを実行し、きれいに終了できます。
シグナルハンドラーは、CまたはC ++ライブラリの呼び出しの途中など、ほぼいつでも呼び出すことができます。これは問題になる可能性があります。
所属していません StackOverflow