daemon を作る
POSIX標準ではないが、 daemon 関数があるので、お手軽に作成できる
daemon 関数は man 3 daemon とするか、404 - エラー: 404を参照のこと。
ちなみに、引数に 0 を渡した時の動作は書いてあるけれど、それ意外の場合・・・例えば、カレントディレクトリを移動したくないよ! とかのときにどのように引数を渡していいかはよくわからん。0以外なら〜という話なのか?
daemon のサンプル
#include <stdio.h> #include <unistd.h> int main(void) { if(daemon(0, 0) == 0) { sleep(5); } else { printf("error\n"); } return 0; }
daemon 関数は成功すれば 0 が返る。また、 daemon 関数が成功した時点でターミナルから切り離されたり標準出力が /dev/null に吐かれるようになるので、 daemon 関数以降に標準出力系を行うのは無意味になります。
上記の例だと、 daemon に変身してから 5 秒経ったらプロセスを終了します。
マジもんのプロセスを作るなら
こんな感じで、ループさせてあげる
#include <stdio.h> #include <unistd.h> void mainLoop() { while(1) { // なんか処理 sleep(3); //とりあえずスリープさせておく } } int main(void) { if(daemon(0, 0) == 0) { mainLoop(); } else { printf("error\n"); } return 0; }
こんな感じで、mainLoop に daemon プロセスの実際の動作を書いてあげると良いかも。
上記のソースだとずっとスリープするだけで、そのままでは終了しないので ps コマンドで見ると普通に動いているのがわかる。
sugamasao% ps aux
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
sugamasao 5709 0.0 0.0 591424 128 ?? Ss 12:07AM 0:00.00 ./a.out
:
殺してあげないとそのままなので、殺します。
sugamasao% kill -TERM 5709
sugamasao% ps -ef | grep out
501 5851 5840 0 0:00.00 ttys003 0:00.00 grep out