- в чем выгода от концепции процесса зомби?
Процесс зомби - это просто pid, статус выхода и некоторая учетная информация, которая остается до тех пор, пока родитель не использует одно из семейства wait
системные вызовы, чтобы получить его окончательный статус.Пока родитель не вызовет wait
идентификатор дочернего процесса должен оставаться отмеченным как использованный, чтобы никакой другой процесс не мог быть назначен ему.Если бы другому процессу был назначен переработанный pid, было бы трудно определить разницу между ним и предыдущими процессами, которые имели тот же pid.Как только родительский номер wait
вызывается и возвращается окончательное состояние выхода, можно предположить, что никто не будет снова искать ребенка за этим pid, поэтому теперь pid можно использовать повторно.(Я думаю, что в Linux, если родитель оставляет SIGCHLD как SIG_IGN, ядро не будет держать зомби, но перерегистрация расположения SIGCHLD как SIG_IGN не даст того же эффекта)
- знать, что ядро сохраняет (PID, статус завершения, информация об использовании ресурсов) для процесса зомби, что означает «информация об использовании ресурсов»
Часть этой информации - то, о чем будет сообщать запущенная программа:
time my_program
.Эти значения обычно сообщаются в структуре siginfo для SIGCHLD (которая не является точно вызовом wait
), но также доступны из вызова в форме waitid
вызова systme (в некоторых системах).Посмотрите на man sigaction
информацию об этой структуре.
- как PPID зомби () = 1 и он все еще зомби (init пожинает зомби, потому что он по умолчанию wait ())
Aзомби, чей ppid = 1 не должен оставаться зомби очень долго, потому что init должен пожинать его довольно быстро.Процесс будет оставаться зомби с момента, когда он вскоре умрет (либо с помощью exit
, либо с помощью неуправляемого сигнала, который его убивает), пока его родитель не вызовет wait
и не получит свой окончательный статус.Это означает, что даже если init ничего не делает, кроме как вызывает init снова и снова, может пройти небольшое время, когда процесс может проявиться как зомби.Если процессы отображаются как потомки init (0 = ppid) в течение длительного времени (в секундах), то, возможно, что-то не так.
- любой может написать некоторый C-код, чтобы сделатьзомби, его родитель Инициатор?
Это не ясно, но я думаю, что вы хотите:
pid_t f = fork();
if (f > 0) {
exit(0); // this is the parent dying, so the child will be an orphan
// and get adopted by init
} else if (f == 0) {
sleep(100); // This is the child doing something that takes enough time for
// its parent to commit suicide (exit(0)) and then for you to
// observe that it has now been adopted by init
exit(0); // And now it dyes as well, so init should reap its status, but
// it may be a zombie for a short amount of time first.
} else /* error condition would be handled here */
- могут ли зомби отказаться от какой-либо блокировки памяти ??
Зомби не могут ничего удержать.Они теряют все свои страницы памяти, дескрипторы открытых файлов и т. Д.Практически все, что операционная система может выяснить, как освободиться, должно быть освобождено.Это не ошибка, но помните, что ОС должна знать, что она должна быть освобождена.Очень легко создать ресурсы в пространстве пользователя, которые должны быть освобождены, когда программа умирает, и ОС не знает, что она должна быть освобождена.