У меня есть приложение в Go, которое перенаправляет STDIN и STDOUT из двоичных файлов, а затем запускает их. В двух словах я делаю:Golang: Child Processes становятся зомби
- create command object with the binary path (lets call the object command A) - create command object with the binary path (calling it command B) - set the stdout of command B to the stdin of Command A - start command A - start command B
я заметил, когда процесс выходит команда B, а команда А работает, он становится процессом зомби в таблице процессов.
Вот пример:
commandA := exec.Command("samplebin")
commandB := exec.Command("sample2bin")
cmdAStdin := commandA.StdinPipe()
commandB.Stdout = cmdAStdin
commandA.Start()
commandB.Start()
Почему commandB стать зомби, если он выходит во время commandA все еще работает? Я бегу Go 1.5 на Ubuntu 14.
Итак, SIGCHLD отправляется дочерними процессами прямо перед тем, как стать зомби? Тогда как «игнорировать» SIGCHLD? Улавливая сигнал и ничего не делая? – AJPennster
SIGCHLD отправляется ядром, когда ребенок является частью зомби. Если вы хотите игнорировать SIGCHLD и все еще получать зомби, установите действие SIGCHLD на SIG_DFL (по умолчанию), а не на SIG_IGN - действие по умолчанию - ничего не делать, но все равно получить зомби. –
Я не хочу зомби, я хочу, чтобы очищенные процессы были очищены. Я попытался настроить сигналы в главном приложении, чтобы игнорировать SIGCHLD и что все еще сделал зомби, поэтому я в конечном итоге вызываю Wait(). – AJPennster