Я написал программу-демон в 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;
}
Это не C. Это похоже на C++. Исправьте свои теги, пожалуйста. (Мы отсоединяемся от терминала, потому что когда терминал закрывается, все процессы, все еще подключенные к терминалу, получают сигнал SIGHUP. Новая группа процессов (новый сеанс) запускается, потому что сигналы могут быть отправлены во всю группу процессов (и этот механизм очень полезно, например, для уведомления мультипроцессных демонов), а новый демон логически отделен от предыдущей группы процессов.) Кроме того, процессы Linux не «крашутся без причины» *. Всегда есть причина: либо статус выхода, либо сигнал, из-за которого процесс умирает. –
Остановить добавление тега C для кода, отличного от C! – Olaf
Простое изменение некоторых вызовов не делает код кода C++ C. Это не компиляция с компилятором C! Прими решение! Используйте компилятор C для компиляции кода C. C++ - это ** другой ** язык! Итак, вы, по-видимому, используете компилятор C++ для его компиляции. – Olaf