2016-09-11 2 views
-1

Я написал программу-демон в Linux в соответствии с руководством в [http://linux.die.net/man/1/daemonize][1], но процесс разбился несколько раз, и я не могу найти причину. Меня это беспокоило несколько дней.как daemonize программа c/C++ в Linux

Сегодня я случайно прочитал «Сеть UNIX Программирование том 1, третье издание» W.Richard Stevens. И в этой книге он показывает пример для написания программы-демона. После прочтения примера я понял, что «Отсоединить от терминала управления» отсутствует в моем коде.

Теперь мой вопрос заключается в демоннизации процесса, почему нам нужно отключиться от терминала управления? И связано ли это с крушением процесса? Есть ли другое место в моем коде для daemonize?

Цените свои повторы.

Вот мой код:

bool daemonize() 
{ 
    // http://linux.die.net/man/1/daemonize 

    // change working dir to root 
    (void) uchdir("/"); 

    // close stdin, stderr, stdout 
    if (int fdnull = open("/dev/null", O_RDWR)) 
    { 
     dup2 (fdnull, STDIN_FILENO); 
     dup2 (fdnull, STDOUT_FILENO); 
     dup2 (fdnull, STDERR_FILENO); 
     close(fdnull); 
    } 
    else 
    { 
     Log (ERR, "Failed to open /dev/null"); 
     return false; 
    } 

    // detach from previous process group 
    if (setsid() == -1)  /* request a new session (job control) */ 
    { 
     Log (ERR, "Failed to detach from previous process group"); 
     return false; 
    } 

    // inhibit others completely and group write 
    umask(027); 

    // it's dameonized! 
    return true; 
} 
+0

Это не C. Это похоже на C++. Исправьте свои теги, пожалуйста. (Мы отсоединяемся от терминала, потому что когда терминал закрывается, все процессы, все еще подключенные к терминалу, получают сигнал SIGHUP. Новая группа процессов (новый сеанс) запускается, потому что сигналы могут быть отправлены во всю группу процессов (и этот механизм очень полезно, например, для уведомления мультипроцессных демонов), а новый демон логически отделен от предыдущей группы процессов.) Кроме того, процессы Linux не «крашутся без причины» *. Всегда есть причина: либо статус выхода, либо сигнал, из-за которого процесс умирает. –

+0

Остановить добавление тега C для кода, отличного от C! – Olaf

+0

Простое изменение некоторых вызовов не делает код кода C++ C. Это не компиляция с компилятором C! Прими решение! Используйте компилятор C для компиляции кода C. C++ - это ** другой ** язык! Итак, вы, по-видимому, используете компилятор C++ для его компиляции. – Olaf

ответ

3

Основные шаги по deamonize на C или программы C++ уже упоминалось в этом вопросе: Creating a daemon in Linux

Да, вопрос был на C, а не для C++, но так как системные вызовы вам нужно демонизировать программу, то в обоих случаях выполняются C-функции, что на самом деле не имеет значения.

1

Не адресации актуальный вопрос, но ...

Я написал программу-демон на Linux в соответствии с руководством по [http://linux.die.net/man/1/daemonize][1],

пожалуйста, нет!

Программы, которые daemon -ize - это проклятие любой разумной системы инициализации и сервис-трекера. Проблема в том, что после того, как программа отсоединяется от управляющего терминала и родительского процесса, становится сложно отслеживать состояние и восстанавливать контроль над ним. Обычный способ использования PID-файлов зависит от условий гонки, что особенно плохо, если намерение заключается в автоматическом повторении такого процесса.

Использование daemon привело к разработке нескольких хаков, некоторые из которых были абсолютно уродливыми, но все они красивы. Сделайте себе и всем остальным мир и не демонанизируйте свою программу.

Смежные вопросы