web-dev-qa-db-ja.com

プロセスデーモンの作り方

私は自分のプログラムをデーモンにする方法を理解しようとしているので、私が遭遇したいくつかのことは一般的には、プログラムはデーモンになるために次のステップを実行します:

  1. fork( )を呼び出します。
  2. 親で、exit( )を呼び出します。これにより、元の親(デーモンの祖父母)は、子が終了したこと、デーモンの親が実行されなくなったこと、およびデーモンがプロセスグループリーダーではないことを確認します。この最後のポイントは、次のステップを正常に完了するための要件です。

  3. setsid( )を呼び出して、デーモンに新しいプロセスグループとセッションを与えます。両方ともリーダーとしてそれを持っています。これにより、プロセスに制御端末が関連付けられていないことも保証されます(プロセスは新しいセッションを作成し、セッションを割り当てないため)。

  4. chdir( )を使用して、作業ディレクトリをルートディレクトリに変更します。これは、継承された作業ディレクトリがファイルシステム上のどこにでも存在できるためです。デーモンはシステムのアップタイムの間実行される傾向があり、ランダムなディレクトリを開いたままにしたくないため、管理者がそのディレクトリを含むファイルシステムをアンマウントできないようにします。

  5. すべてのファイル記述子を閉じます。

  6. ファイル記述子0、1、および2(標準入力、標準出力、および標準エラー)を開き、/dev/nullにリダイレクトします。
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/fs.h>

int main (void)
{
    pid_t pid;
    int i;

    /* create new process */
    pid = fork ( );  
    if (pid == -1)  
        return -1;  
    else if (pid != 0)  
        exit (EXIT_SUCCESS);  

    /* create new session and process group */  
    if (setsid ( ) == -1)  
        return -1;  

    /* set the working directory to the root directory */  
    if (chdir ("/") == -1)  
        return -1;  

    /* close all open files--NR_OPEN is overkill, but works */  
    for (i = 0; i < NR_OPEN; i++)  
        close (i);  

    /* redirect fd's 0,1,2 to /dev/null */  
    open ("/dev/null", O_RDWR);  
    /* stdin */  
    dup (0);  
    /* stdout */  
    dup (0);  
    /* stderror */  

    /* do its daemon thing... */  

    return 0;  
}

このプロセスをより深く理解できるように、Apacheのようなプログラムの既存のソースコードへのリンクを教えてください。

67
Registered User

クリーンなアプローチを探している場合は、標準のapi -int daemon(int nochdir, int noclose);の使用を検討してください。マニュアルページは非常にシンプルで自明です。 manページ 。十分にテストされたapiは、移植性と安定性の独自の実装intermsをはるかに上回ります。

17
deadbeef

Linuxでは、以下を使用して簡単に実行できます。

int main(int argc, char* argv[])
{
    daemon(0,0);
    while(1)
    {
        sleep(10)
        /*do something*/
    }

    return 0;
}
2
Alok Prasad