Процессы зомби на самом деле действительно важны и, безусловно, необходимо. Во-первых, важно понять, как работает процесс создания в Unix/Linux. Единственный способ создать новый процесс - создать существующий процесс для создания нового дочернего процесса через fork()
. Таким образом, все процессы в системе расположены в красивой упорядоченной деревенской иерархии. Попробуйте запустить ps -Hu <your username>
в системе Linux, чтобы увидеть иерархию процессов, которые у вас есть.
Во многих программах критически важно, чтобы родительский процесс мог получить основную информацию о своих дочерних процессах, которые вышли. Эта основная информация включает в себя статус выхода и использование ресурса для ребенка. Когда родитель готов получить информацию о мертвом дочернем процессе, он вызывает одну из функций wait()
, чтобы дождаться выхода ребенка и получить статус выхода и информацию об использовании ресурсов.
Но что происходит, если дочерний процесс завершается до того, как родитель ждет его? Здесь необходимы процессы зомби. Операционная система не может просто отказаться от дочернего процесса; операция родительского процесса может зависеть от знания статуса выхода или использования ресурса для ребенка. т.е. родительский процесс, возможно, должен знать, что ребенок вышел из строя ненормально, или может собирать статистику использования ЦП для своих детей и т. д. Таким образом, единственный выбор - это сберечь эту информацию и сделать ее доступной для родителя, когда она наконец позвоните по номеру wait()
. Эта информация является тем, что является зомби-процессом, и это критическая часть того, как управление процессами работает в Unix/Linux. Процессы Zombie гарантируют, что родитель может быть способен восстановить статус выхода, учетную информацию и идентификатор процесса для дочерних процессов, независимо от того, вызывает ли родитель wait()
до или после выхода дочернего процесса.
Вот почему зомби-процесс составляет.
Сноска: Если родительский процесс никогда не называет wait()
, то дочерний процесс предок к init
процесса, когда родительский процесс умирает, и init
будет wait()
для ребенка.
Как отправить SIGCHLD родительскому процессу зомби удалить зомби? У вас есть ссылка на это? Кроме того, каждый процесс, который создает дочерние процессы, которые заканчиваются в определенный момент, создаст процесс зомби. Поэтому утверждение «Программа, создающая зомби-процессы, не запрограммирована должным образом». также неверно. Я думаю, вы имели в виду ** «Процесс, который не убирает его зомби, не запрограммирован должным образом» **. – Flow
Отправка 'SIGCHLD' родителям происходит автоматически, когда дочерний процесс завершается. Если родительский процесс запрограммирован правильно, то есть с одним из вызовов 'wait()', повторная отправка будет иметь нулевой эффект, и если он запрограммирован правильно, он уже обработает исходный сигнал, поэтому обработка его снова просто смутит его и вызвать ошибку в зависимости от того, какой вызов 'wait()' использует. – EJP
Это не должно вызывать ошибки в вызове 'wait()', если обработка родительских 'SIGCHLD' реализована должным образом. Это просто вызовет ненужный вызов обработчика сигнала. В противном случае вы правы: ОС, совместимые с POSIX, отправит «SIGCHLD», если состояние ребенка изменилось, поэтому ручная отправка SIGCHLD не улучшит ситуацию. – Flow