2025/11/09 21:14 Daemon Example in C

やあ、ロボ子。今日はデーモンについて話すのじゃ。

デーモンですか?バックグラウンドで動くプロセスのことですよね。

そうそう!制御端末なしで動く、縁の下の力持ちみたいなやつじゃ。nginxとか、sshdとか、cronとか、色々あるぞ。

なるほど。デーモンは`stdout`、`stderr`、`stdin`に書き込めないから、ログファイルに書き出すんですね。

その通り!`/var/log`ディレクトリにね。入力はソケットとかシグナルを使うことが多いぞ。

Unixにはsystemdサービスというものがあって、systemdがデーモンプロセスを監視するんですね。

そうじゃ!デーモンを作る方法は色々あるぞ。プログラムで`fork()`を使う方法と、systemdサービスを使う方法があるのじゃ。

`unistd.h`の`daemon`関数を使うか、「ダブルフォーク」を使うんでしたっけ。

`Type=simple`、`Type=notify`、`Type=forking`のsystemd.serviceを作る方法もあるぞ。`Type=simple`が推奨らしいのじゃ。

実行中のデーモンは、親プロセスIDがinitプロセス(1)で、端末に接続されていなくて、標準入出力が閉じられていることが多いんですね。

そうじゃな。あと、rootユーザーで実行されてないことが多いぞ。開かれたファイルは、共有オブジェクトファイル、ログファイル、ソケットのメモリマッピングが多いのじゃ。

glibcの`daemon`関数にはバグが報告されているんですね。

そうなんじゃ。だから、ダブルフォークが安全って言われてるのじゃ。制御端末を取得する方法がないからな。

ダブルフォークの手順は、まず`fork()`でバックグラウンド実行、次に`setsid()`で新しいセッションを開始、最後に再度`fork()`ですね。

`setsid()`を呼ぶと、プロセスがプロセスグループリーダー、セッションリーダーになって、端末がなくなるのじゃ。

デーモンとして実行されるコードを開発する場合、最初にデーモンとして実行されていない間にテストすることが推奨されるんですね。

そうじゃ!あと、シグナルハンドラーをインストールして、デーモンと通信できるようにすることも大事じゃ。SIGKILLとかが送られてきたときに、ちゃんとクリーンアップできるようにね。

ロギングも重要ですね。`/var/log`のログファイルに書き込むようにするんですね。

その通り!デーモンは奥が深いけど、ちゃんと理解すれば、システムを安定させるのに役立つぞ。

勉強になりました!

ところでロボ子、デーモンって悪魔って意味だけど、プログラムの世界では縁の下の力持ちって、なんだか皮肉じゃな?

確かにそうですね!でも、悪魔もたまには良いことをするかもしれませんよ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
