ネット上にはデーモンの実装例がたくさんあります。私が見たほとんどの場合、daemon(3)関数を使用してプログラムをバックグラウンドで実行していません。それは単なる好みや無知の問題ですか、それとも独自のデーモン化関数を作成する正当な理由がありますか?daemon(3)を使用することに特定の欠点はありますか?安全ではありませんか?
4 に答える
デーモン()関数は、これまですべての種類のUnixで使用できるわけではなかったため、多くの「ポータブル」コードでは使用されていません。関心のあるすべてのターゲットプラットフォームにdaemon()がある限り、独自のレシピを作成する理由は実際にはありません。
BSDデーモン()関数は非常に制限されており、誤用を招きます。この機能を正しく使用できるデーモンはごくわずかです。
systemdのマニュアルページには、デーモン化するときに正しく記述されたSysVデーモンが実行する必要があることのリストがあります。
daemon
POSIXには機能がありません。これはベンダーの拡張機能です。したがって、ポータブルコードを作成する人は、自分でコードを作成するだけです。
daemon()
標準の関数アクションが気に入らない場合は、独自に作成することもできます。ルートディレクトリに切り替えるかどうかを制御できます。標準I/Oチャネルを/dev/nullに再接続するかどうかを制御できます。ただし、stderrをログファイルに対して開いたままにしておきたい場合は、stdinとstdoutを/ dev / nullに再接続するときにdaemon()
、適切なオプションを使用してから他のコードを使用する方が、独自のコードを使用するよりも優れているかどうかを判断する必要があります。
ロケット科学はあまりありませんdaemon()
。fork()
それはとを呼び出しますsetsid()
(Linuxバージョンによると、MacOSバージョンdaemon()
は動作中にSIGHUPを一時停止することに言及しています)。デーモン化の詳細については、標準のリソースを確認してください。例:
W.リチャードスティーブンス、ビルフェナー、アンドリューM.ルドフ UNIX®ネットワークプログラミング、第1巻:The Sockets Networking API、第3版
Marc J Rochkind Advanced Unix Programming、2nd Edn