Попытка убить порожденный процесс заканчивается несуществующим процессом

Сценарий: я разрабатываю приложение для мониторинга демонов, которое запускает и останавливает демоны по запросу (TCP-IP). Для этого после разветвления я вызываю setsid(), чтобы «отсоединить» новый процесс от родителя (процесс мониторинга).

Когда я пытаюсь убить один из процессов, созданных приложением мониторинга, он прекращает свое существование.

Вот мой код:

int retval;
char* arg_list[] = {
  NULL      /* The argument list must end with a NULL.  */
};
retval = fork();
if (retval == 0)
{
    umask(0);
    setsid();
    execv(LBSDPATH, arg_list);
    exit(0);
}

Насколько я понимаю, несуществующий/зомби-процесс означает, что родитель еще не присоединился к процессу. не setsid() решить?


person stdcall    schedule 27.05.2013    source источник


Ответы (1)


Родителю необходимо вызвать wait() или waitpid(), чтобы дочерний процесс был «освобожден» из состояния несуществующего/зомби.

Это можно сделать в родительском потоке, а также в обработчике родительского сигнала, обслуживающем сигнал SIGCHLD, полученный после смерти дочернего элемента.


Обновить

Ссылаясь на необходимость переродить ребенка в init, чтобы он мог жить как деймон, как указано в комментарии Mellowcandle:

Всего fork() дважды. То есть: первый процесс fork()ed всего лишь fork()s от другого.

Пусть второй процесс fork()ed выполнит exec*(), и пусть первый процесс fork()ed завершится.

Когда затем первый fork()ed процесс заканчивается, его дочерний процесс (второй fork()ed процесс и вместе с ним его преемник: exec*()ed) наследуется init, который затем обрабатывает SIGCHLD/смерть этого дочернего процесса.

person alk    schedule 27.05.2013
comment
Я это знаю, но я хочу, чтобы создаваемый мной процесс работал независимо, как демон. - person stdcall; 27.05.2013
comment
@Mellowcandle: Затем fork() дважды. Пусть второй процесс fork()ed выполнит exec*(), а первый процесс fork()ed завершится. Когда затем первый fork()ed процесс умирает, его потомки (второй fork()ed процесс и вместе с ним exec*()ed) наследуются init, который затем обрабатывает SIGCHLD/смерть дочернего процесса. - person alk; 27.05.2013
comment
Я не думаю, что я правильно объяснил, пожалуйста, посмотрите мое редактирование вопроса. - person stdcall; 27.05.2013
comment
Я рекомендую вам прочитать stackoverflow.com/questions/881388 , и когда вы прочитаете все это и думаете, что понимаете это , прочтите его еще раз, чтобы убедиться. Я почти уверен, что вы найдете там свой ответ. - person This isn't my real name; 27.05.2013
comment
@mellowcandle: См. выше комментарий Элхонона Эдельсона. - person alk; 27.05.2013
comment
@alk Спасибо, это решило мою проблему, если вы напишете это как ответ, я приму ответ! - person stdcall; 28.05.2013