萌えハッカーニュースリーダー

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

出典: https://lloydrochester.com/post/c/unix-daemon-example/
hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

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

hakase
博士

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

roboko
ロボ子

勉強になりました!

hakase
博士

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

roboko
ロボ子

確かにそうですね!でも、悪魔もたまには良いことをするかもしれませんよ?

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search