すがブロ

sugamasaoのhatenablogだよ

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

いなくなった。
daemon を作る最低限の準備は daemon 関数に任せると簡単で良いですね。