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

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

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


person Registered User    schedule 21.03.2011    source источник
comment
Вы можете получить исходные коды Apache здесь.   -  person nmichaels    schedule 22.03.2011
comment
Возможно, вам может помочь daemon (3). В основном это говорит о том, что необходимый функционал уже реализован.   -  person Vlad    schedule 22.03.2011
comment
@nmichaels, спасибо за ваше сообщение, на самом деле я ищу только те строки, которые делают его демоном. Apache не специально. Так что, если где-то в Интернете будет проще, чем загрузить весь исходный код.   -  person Registered User    schedule 22.03.2011
comment
@Vlad Я видел daemon3, но хочу разобраться с полным основанием.   -  person Registered User    schedule 22.03.2011
comment
Связано с stackoverflow.com/questions/3095566/linux-daemonize   -  person ninjalj    schedule 22.03.2011
comment
Обратите внимание, что согласно их руководствам, как setsid (), так и chdir () не могут потерпеть неудачу, поэтому вам не нужно проверять соответствующие возвращаемые значения.   -  person Philip    schedule 22.03.2011
comment
В дополнение к тому, что делает daemon, я обычно передаю права некоторым пользователям и группам, используя setgid и setuid. Если вы хотите узнать, что делает daemon, я бы посмотрел в источник   -  person Jens Munk    schedule 22.05.2016
comment
Приведенный выше пост является почти 100% копипастом из книги Системное программирование Linux, 2-е издание - разговор напрямую с ядро и библиотека C Роберта Лава (страницы 173, 174). Было бы неплохо, если бы @RegisteredUser упомянул об этом.   -  person patryk.beza    schedule 07.08.2016
comment
В 2004 году Девин Ватсон написал хорошую статью на эту тему: Linux Daemon Writing HOWTO. Он был заархивирован, по крайней мере, на нескольких сайтах: archive.org по состоянию на 03.06.2006 и bibalex.org по состоянию на 03.06.2006   -  person Makyen♦    schedule 18.11.2016


Ответы (2)


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

person deadbeef    schedule 22.05.2016
comment
Я рад, что теперь это ответ, а не скрытый в комментариях. Возможно, вы могли бы немного конкретизировать его - ссылку на стандарт (или, что еще лучше, ссылку на учебное пособие или пример). - person RJHunter; 22.05.2016
comment
@deadbeef Этот ответ намного лучше простого ссылка только ответы, которые присутствовали ранее. Но хотя это также довольно близко к только ссылке (в любом случае я бы счел данную ссылку более стабильной). Я бы попытался улучшить ответ, приведя короткий образец кода (тем более, что его нет на связанной странице руководства) или процитировав синопсис. - person πάντα ῥεῖ; 23.05.2016
comment
Обратите внимание, что функция daemon не Совместимость с POSIX. - person patryk.beza; 07.08.2016
comment
На freedesktop.org/software/systemd/man/daemon.html # SysV% 20Daemons написано, что функция BSD daemon() не должна использоваться, поскольку она реализует только подмножество этих [15] шагов. - person oli_arborum; 15.02.2017

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

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

    return 0;
}
person Alok Prasad    schedule 28.01.2018