Процесс становится зомби, когда он выходит и до того, как его родительский процесс получает свой статус с помощью wait()
. Когда один процесс разветвляется на другой, а затем завершается, дочерний процесс становится родителем pid 1 (классически «init»), который сразу же получает состояние процесса. Поэтому обычно проблема заключается в том, что вы описываете наоборот: ребенок становится зомби (поскольку родитель не был написан, чтобы иметь дело с SIGCHLD
и вызывать wait()
), но когда родитель выходит, зомби наследуется init
и сразу пожали. Фактически, обычное решение полностью отделить дочерний процесс от его родителя («daemonize») включает в себя преднамеренное разветвление и выход из промежуточного процесса, так что демон сразу становится потомком init
.
Изменить: Если вы находитесь в оболочке и хотите добиться этого эффекта, попробуйте (subprocess &)
. В скобках создается подоболочка, которая выполняет subprocess
в фоновом режиме, а затем немедленно завершается.