
Я редактирую этот вопрос, так как он был отмечен как дубликат другого вопроса о том, как убить зомби-процесс.
Я не ищу ответ на вопрос, как убить процесс-зомби. В моей системе нет зомби, и я знаю, как они создаются.
Попробую перефразировать вопрос. В настоящее время приняты следующие методы удаления зомби:
Отправка SIGCHLD родителю. Теоретически работает, но не всегда на практике, поскольку одной из причин, по которой зомби был создан изначально, могло быть то, что родитель не реагировал должным образом на SIGCHLD.
Завершение родительского процесса.
- Исправление ошибки в программе, создавшей Зомби.
- Перезагрузка.
Или как упоминалось вздесь
Или по этой причине, упомянутой @richard в комментариях к моему вопросу перед этой правкой:
..to prevent the pid being reused. The parent has the pid of the child and may signal the child (may try to kill it), just from the pid it recieved when it created the child. It would be bad for the pid to be reused. Therefore the child remains in a zombie state until the parent acknowledges the death of the child, or the parent dies.
Теперь мои вопросы:
Почему не существует простого и прямого метода уничтожения зомби или зомби?
Каковы были бы побочные эффекты/последствия, если бы зомби можно было убить с помощью сигнала?
Что мешает разработчикам *NIX создать СИГНАЛ или команду (прошу прощения, если фраза «создание нового сигнала» технологически неприемлема), которая уничтожит зомби?
решение1
Процесс уже мертв в это время. Нет смысла убивать его снова. Он все еще записан в таблице процессов, чтобы родительский ti мог получить его статус.
Обратите внимание, что все процессы становятся зомби после завершения. Вы просто их не видите, потому что большинство родительских процессов очень быстро очищают своих потомков. Вы можете захотеть подать отчет об ошибке, если программное обеспечение не очищает своих зомби, и они очищаются тольков этомпосле завершения родительского процесса.
Ваш дополнительный вопрос: почему SIGKILL
не удаляет его из таблицы процессов. Сначала вы должны рассказать нам, почему он должен это сделать. Я не знаю ни одной причины, по которой пользователь мог бы удалить несуществующий процесс из таблицы процессов. При проектировании операционной системы всегда следует иметьхорошая причина что-то сделатьпрежде чем ты спросишьпочему бы не сделать это. Вы просите функцию, не имеющую реального варианта использования.
Помимо отсутствия цели, это имело бы плохие последствия. Родитель вызывает wait()
и/или waitpid()
для того, чтобы узнать статус детей, которые вышли. Результат вызова является постоянным, независимо от того, вызван ли он до того, как процесс становитсянесуществующий, до того, как вы выдадите SIGKILL
, или после этого.
Если бы ядро не хранило записи (т. е. процесс был бы удален из таблицы процессов), поведение было бы несогласованным, и родитель должен был бы ожидать несогласованности и справляться с ней без веской причины. В системах, которые повторно использовали бы старыепидзначения, не ведение записей может привести к гораздо более серьезным проблемам, таким как случайное завершение программного обеспечения совершенно другого процесса.
Смотрите также:http://en.wikipedia.org/wiki/Зомби_процесс