Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Registered UserОтветов: 2

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

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

  • Вы можете получить исходные коды Apache здесь. nmichaels 22.03.2011
  • Возможно, вам может помочь daemon (3). В основном это говорит о том, что необходимый функционал уже реализован. Vlad 22.03.2011
  • @nmichaels, спасибо за ваше сообщение, на самом деле я ищу только те строки, которые делают его демоном. Apache не специально. Так что, если где-то в Интернете будет проще, чем загрузить весь исходный код. Registered User 22.03.2011
  • @Vlad Я видел daemon3, но хочу разобраться с полным основанием. Registered User 22.03.2011
  • Связано с stackoverflow.com/questions/3095566/linux-daemonize ninjalj 22.03.2011
  • Обратите внимание, что согласно их руководствам, как setsid (), так и chdir () не могут потерпеть неудачу, поэтому вам не нужно проверять соответствующие возвращаемые значения. Philip 22.03.2011

clinuxdaemonsystems-programming

Ответы

Ответ 1 · рейтинг 20 · deadbeef

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

Ответ 2 · рейтинг 2 · Alok Prasad

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

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

    return 0;
}

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы