Может ли дочерний процесс идти <defunct>без смерти родительского процесса? - PullRequest
4 голосов
/ 13 декабря 2011

kill - это убивает процесс сразу?

Я нашел свой ответ и настроил обработчик сигнала для SIGCHLD и ввел wait в этот обработчик. Таким образом, всякий раз, когда родительский процесс kill является дочерним процессом, вызывается этот обработчик, и он вызывает wait to reap child. - мотив очистить запись таблицы процессов.

Я все еще вижу, как некоторые дочерние процессы работают в течение нескольких секунд, даже если родительский процесс не умирает. - как это возможно ? 1014 *

Я вижу это через ps. Точно ps -o user,pid,ppid,command -ax и greping для родительского процесса, дочернего процесса и несуществующего.

Ответы [ 2 ]

6 голосов
/ 13 декабря 2011

Процесс перестает функционировать (зомби) сразу после выхода (из сигнала, вызова exit, возврата из main, что угодно). Он остается зомби до тех пор, пока wait не будет включен его родителем.

Итак, все процессы хотя бы ненадолго становятся зомби при выходе.

Если родительский процесс требует немного (потому что он выполнял другую работу или просто потому, что планировщик еще не выделил ему время ЦП) перед вызовом wait, тогда вы увидите зомби немного. Если родитель никогда не вызывает wait, то когда он в конце концов выйдет, init (pid 1) примет своих зомбированных потомков и вызовет для них wait.

5 голосов
/ 13 декабря 2011

Дочерний процесс перестает функционировать (становится зомби) только тогда, когда его родительский процесс не умер и еще не ждал его.Если исходный родитель умер, то родительский дочерний элемент становится идентификатором процесса 1, и основная задача этого процесса состоит в том, чтобы дождаться смерти его (унаследованных) дочерних элементов и удалить их из списка процессов, чтобы они не были зомби.(Примечание: ребенок-сирота или демон автоматически наследуется PID 1; он не назначается бабушке и дедушке или прабабушке в иерархии процессов.)

Между временем смерти иродитель собирает информацию о выходе через wait() (или waitpid(), или waitid(), или через любой другой вариант), это зомби в списке процессов, отображаемом как defunct на ps.

Но чтобы ответить на заголовок вашего вопроса:

  • Да, процесс может перестать существовать без смерти его родителя.

(И он может перестать существовать, только если его родительне умер.)

...