69

プログラムをデーモンにする方法を理解しようとしています。一般に、プログラムはデーモンになるために次の手順を実行します。

  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 などのプログラムの既存のソース コードへのリンクを教えてください。

4

2 に答える 2

2

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

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

    return 0;
}
于 2018-01-28T16:27:59.360 に答える