起動時にUnixドメインソケットを作成してそれを受信し始めるアプリケーションがあるとします。これにより、アプリケーションの後続のすべてのインスタンスがそのソケットに接続され、データを最初のインスタンスに渡して終了します(または他のインスタンスが実行中であると検出された場合は単に終了します)。
私が理解したところ、これらのソケットはファイルシステムのファイルとして表示されます。任意のサードパーティのプログラムやユーザーがファイルを削除したとしましょう。これで、後続のプロセスは最初のインスタンスを検出/通信できなくなります。
最初のファイルが何とかソケットファイルの削除を検出して再生成できますか?
答え1
削除されたUnixソケットファイルは再作成できません。
実際には、同じパスを使用して別のソケットファイルを生成できますが(ソケットファイル記述子を同じアドレスに再バインドしようとしましたが)、接続を試みるクライアントは接続するのではなく「接続がブロックされました」。拒否メッセージが表示されます。最初にバインドされたソケットに接続されます。
Unixソケットは基本的に次のようにバインドされているからです。インデックスノード、パスの代わりに。 netcatがUnixソケットをサポートしているかどうかを簡単に確認できます。
nc -lU /tmp/old_sock &
[1] 19241
ln -f /tmp/old_sock /tmp/new_sock; rm /tmp/old_sock
# or mv /tmp/old_sock /tmp/new_sock
echo yup | nc -U /tmp/new_sock
yup
プログラムができることは、既存のソケットを閉じて別のソケットを作成して同じアドレスにバインドすることです。ファイルの削除に関する通知を受け取るには、inotify(7)
Linux、kqueue(2)
BSDで使用することも、stat(2)
他のファイルと同様に定期的にパスで実行することもできます。
Linuxには「抽象」Unixソケットもあります。このソケットはファイルシステムオブジェクトではなく一連のバイト[1]にバインドされており、ファイルスタイルのアクセス権は適用されず、「削除」または移動できません。別のアドレスに。
[1]これを「文字列」と呼ぶことができますが、ファイルシステムパスとは異なり、NULバイトを含めることもできます。