как сделать процесс-демон - PullRequest
67 голосов
/ 22 марта 2011

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

  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, чтобы я мог глубже понять этот процесс.

Ответы [ 2 ]

17 голосов
/ 22 мая 2016

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

2 голосов
/ 28 января 2018

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

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

    return 0;
}
...