Как сделать демон процесса

Я пытаюсь понять, как сделать свою программу демоном. Так что некоторые вещи, с которыми я столкнулся, в общем, программа выполняет следующие шаги, чтобы стать демоном:

  • Вызов fork( ).
  • В родителе вызовите exit( ). Это гарантирует, что исходный родитель (демон бабушка и дедушка) удовлетворено, что его ребенок прекратил, что родитель-демонист не и что демон не является лидером группы процессов. Эта последняя точка является обязательным условием успешного завершения следующего шага.

  • Вызвать setsid( ), предоставив демону новую группу процессов и сеанс, оба которые имеют его как лидера. Это также гарантирует, что процесс не связан (поскольку процесс только что создал новый сеанс и не будет назначать один).

  • Измените рабочий каталог в корневой каталог с помощью chdir( ). Готово потому что унаследованный рабочий каталог может находиться где угодно в файловой системе. Демоны имеют тенденцию работать в течение всего времени работы системы, и вы не хотите чтобы открыть какой-либо случайный каталог и, таким образом, запретить администратору размонтирование файловой системы, содержащей этот каталог.

  • Закройте все дескрипторы файлов.

  • Откройте дескрипторы файлов 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 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, чтобы я мог понять этот процесс более подробно.

Ответ 1

Если вы ищете чистый подход, рассмотрите возможность использования стандартного api- int daemon(int nochdir, int noclose);. Персональная страница довольно проста и понятна. man. Хорошо протестированные api намного превосходят наши собственные интермедии реализации переносимости и стабильности.

Ответ 2

В Linux это легко сделать с помощью:

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

    return 0;
}