LINUX.ORG.RU

fork() + exec() = zombie ?


0

0

Мне нужно сделать дочерний процесс, который выполнив чего-то уничтожается, а родительский процесс продолжает работать. Так вот почему-то дочерний процесс уничтожаться не хочет, а остается зомби (стоит метка <defunct>). Как сделать так, что бы процесс действительно исчезал. Вот пример к сказанному:

main () { int s;

s=fork(); if (s==0) { exit(); } else { for (;;) {} } }

Извеняюсь, в топике должно быть: fork() + exit().

Слишком привык к сочетанию fork+exec :)

Reinventer
() автор топика

посмотри в этой же конфе тему "Убить поток" (http://www.linux.org.ru/view-message.jsp?msgid=154141&scroll=group&ba...)
там как раз говорится, зачем нужно вызывать pthread_join().
в данном случае - полная аналогия. так называемый zombie - это не процесс, а запись в таблице процессов. а хранится она для того, чтобы ты в материнском процессе смог получить статус завершившегося дочернего.
существует несколько путей "объяснить" ядру, что тебе этот статус не нужен. самый примитивный - вызвать в родительском процессе, сразу после создания дочернего, waitpid(pid_child, 0x00, WNOHANG);
после этого вызова zombie не будет.

proff
()

Спасибо, правда получилось только с опцией WUNTRACED, с WNOHANG zombie все равно остается.

Reinventer
() автор топика

Все, я понял с опцией WNOHANG waitpid удаляет дочерние процессы-зомби, но ничего не делает с еще незавершившимися процессами, а с опцией WUNTRACED waitpid ждет когда процесс закончится, и удаляет запись в таблице процессов по окончанию процесса.

Reinventer
() автор топика

Можно обработку сигнала поставить void sig(int s){ wait3(0,0,NULL); }

signal(SIGCHLD,sig); Закончившийся дочерний процесс отправляет папе сигнал CHLD

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.