nix Domain Socket を使用するC
でDebianシステムのデーモンプロセスを書いています。
デーモンプロセスの作業ディレクトリがルートディレクトリである場合、ソケットをファイルシステムに配置するための慣用的なディレクトリはありますか?
これらは通常、/tmp
またはそのサブディレクトリにあります。 /tmp
のすべてはシャットダウン時に消去される可能性があることに注意してください-必ずしも消去されるわけではありません。注意してくださいすることができます、それを使用する場合は、作成する必要があるかどうかを確認してください毎回サブディレクトリ。 /tmp
は誰でも読み取り可能であるため、権限を介してアクセスを制限する場合は、サブディレクトリを使用します。
/run
と/var/run
(一緒にシンボリックリンクされる場合があります)も同様の方法で使用されますが、通常はtmpfsファイルシステムとしてマウントされます。つまり、ブート時に作成され、常駐しますメモリ内、ディスク上ではありません(大量のデータをダンプする場所として使用しないでください)。実行時ソケットの場合、これはおそらく良い選択です。
/run
、およびここで言及されている他のすべてのディレクトリexcept/tmp
は、rootのみが書き込み可能であることに注意してください。システムプロセスの場合、これは問題ありませんが、アプリケーションが非特権ユーザーによって実行される可能性がある場合は、/tmp
を使用するか、どこかに永続ディレクトリを作成して、そこにアクセス許可を設定するか、またはユーザーの$ HOME。
インストール中に/usr/share
(または/usr/local/share
)にディレクトリを作成することができます。そこにあるディレクトリとコンテンツは、/tmp
または/run
のように、ブート全体で取得される可能性はありません。ただし、jordanmがコメントで指摘しているように、/usr
は読み取り専用でマウントされ、linuxファイルシステム階層 =ガイドライン これを反映 。もちろん、アプリケーションがインストールされている場合は読み取り専用にすることはできません。そのため、そこにソケットを作成しても問題がない場合は、そのままにして後で使用することができます(ただし、ソケットに書き込むことはできます)ファイルは読み取り専用です)。
読み取り専用でマウントされないブート間でどこかを永続化したい場合、/etc
はシステム全体の構成と再構成によく使用されるため、かなり安全な方法です。 OTOH、ルートファイルシステム全体の基礎となるデバイスが読み取り専用であるシステム(たとえば、組み込みシステム)を使用でき、/ tmpと/ runが別のデバイス(おそらく:メモリー内のtmpfs)にあります。したがって、2つの最も堅牢な戦略は次のようになります。
アプリケーションのインストール時に、ソケットを永続的な場所にインストールします。
実行時に/run
または/var/run
にディレクトリを作成し、そこにソケットを配置します。
/tmp
でのみ同じことを行います。
最初のものの利点は、アプリがインストールされると、何があっても、使用するソケットができることです。 2番目の利点は、それがmayより適切なプログラミングに役立つことです。 3番目の利点は、スーパーユーザー権限を必要としないことです。後で気が変わった場合は、ある実装から別の実装に簡単に切り替えることができます。
最後に、BatchyXが提示されたので、デフォルトの選択にフォールバックして、少なくともこのための構成オプションを提供する必要があります。