名前とbind()
sを使用して特定のパスにUNIXドメインソケットを作成するサーバーアプリケーションがあります。
アプリケーションコード内から意図的にアプリケーションを閉じたり停止したりした場合にのみ、ソケットを削除する必要があります。それ以外の場合は開いている必要があります。どうすればよいですか?
ありがとう!
編集:ターミナル内からアプリケーションを起動して実行するとします。
あなたはこれを必要以上に難しくしています。 unlink()
をbind()
の直前に置きます。それが他のみんなのやり方です。 (例: BSD syslogd 、古典的なunix-domain-socketベースのサービスの1つ)
アプリケーションから複数の出口点があり、クリーンアップルーチンを呼び出すようにそれぞれを変更したくない場合は、「ダーティ」アプローチを使用できます。
ソケットが作成されたばかりの場合は、クリーンアップルーチンをatexit(3)
に登録します。ルーチン(これは単にunlink(2)
の呼び出しです)は、アプリケーションが正常に終了したときに呼び出されます。ただし、アプリケーションがシグナルで終了した場合は呼び出されません。したがって、SIGINTおよび同様のシグナルを受信した後にクリーンアップする場合は、シグナルハンドラーも適切に設定する必要があります。
実行するだけ
unlink("Path/to/Socket");
プログラムを終了する前に。
/ proc/net/unixを見ると、ソケットがアクティブかどうかを確認できます。次に、アプリケーションを起動/再起動する前に、cronで削除するか、etherします。
echo "active sockets in /path/"
cat /proc/net/unix | grep -Eo '/path/.*'
echo "all sockets in path including stale sockets"
ls -1F /path/ | egrep '=$' | sed 's/=$//'
echo "example command to remove stale sockets"
comm -1 -3 <(cat /proc/net/unix | grep -Eo '/path/.*' | sort) <(ls -1F /path/ | egrep '=$' | sed 's/=$//' | sort) | xargs -n1 echo rm
簡単な方法でソケットファイルを削除できます。
unlink(path);
プログラムがプログラムを終了するときはいつでも、それが存在するかどうかを確認し、それを削除します。