web-dev-qa-db-ja.com

アプリケーションを終了するときにUNIXドメインソケットファイルを削除するにはどうすればよいですか?

名前とbind()sを使用して特定のパスにUNIXドメインソケットを作成するサーバーアプリケーションがあります。

アプリケーションコード内から意図的にアプリケーションを閉じたり停止したりした場合にのみ、ソケットを削除する必要があります。それ以外の場合は開いている必要があります。どうすればよいですか?

ありがとう!

編集:ターミナル内からアプリケーションを起動して実行するとします。

10
Pheonix7

あなたはこれを必要以上に難しくしています。 unlink()bind()の直前に置きます。それが他のみんなのやり方です。 (例: BSD syslogd 、古典的なunix-domain-socketベースのサービスの1つ)

15
user2404501

アプリケーションから複数の出口点があり、クリーンアップルーチンを呼び出すようにそれぞれを変更したくない場合は、「ダーティ」アプローチを使用できます。

ソケットが作成されたばかりの場合は、クリーンアップルーチンをatexit(3)に登録します。ルーチン(これは単にunlink(2)の呼び出しです)は、アプリケーションが正常に終了したときに呼び出されます。ただし、アプリケーションがシグナルで終了した場合は呼び出されません。したがって、SIGINTおよび同様のシグナルを受信した後にクリーンアップする場合は、シグナルハンドラーも適切に設定する必要があります。

3
gudok

実行するだけ

unlink("Path/to/Socket");

プログラムを終了する前に。

1
Dominic Gibson

/ 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
0
Jeff Peters

簡単な方法でソケットファイルを削除できます。

unlink(path);

プログラムがプログラムを終了するときはいつでも、それが存在するかどうかを確認し、それを削除します。

0
Will