Вы не можете проверить, является ли процесс зомби с чистыми вызовами POSIX - кроме случаев, когда вы являетесь родительским процессом, и пожинаете его с помощью вызова wait
family . Поэтому вам нужно найти хорошее место, чтобы ждать ребенка.
Один из вариантов - установить обработчик SIGCHLD
и выполнить там waitpid(0, &status, WNOHANG)
. Обязательно зацикливайтесь, пока не перестанут обнаруживаться какие-либо процессы - если в течение короткого промежутка времени умирают двое детей, вы можете получить только один SIGCHLD
.
Другим вариантом является двойная разветвление - fork()
, чтобы дочерний элемент (назовите его дочерним A) снова разветвился, второй exec для дочернего элемента (дочернего элемента B). Тогда ребенок А сразу выходит. Тем временем родитель wait()
запрашивает ребенка A. После того, как ребенка A нет, процесс инициализации системы позаботится о том, чтобы пожать ребенка B, когда он в конечном итоге умрет. Этот метод проще, но ваша оболочка не сможет узнать, когда умирает дочерний элемент B, поэтому, если вам нужна эта информация, используйте первый метод.