Ho un'applicazione in Go che reindirizza lo STDIN e lo STDOUT dei binari e quindi li esegue. In poche parole che sto facendo:Golang: I processi figlio diventano Zombi
- 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
ho notato ogni volta che il processo per le uscite di comando B, mentre il comando A è in funzione, diventa un processo zombie nella tabella dei processi.
Ecco un esempio:
commandA := exec.Command("samplebin")
commandB := exec.Command("sample2bin")
cmdAStdin := commandA.StdinPipe()
commandB.Stdout = cmdAStdin
commandA.Start()
commandB.Start()
Perché commandB diventare uno Zombie, se esce mentre Commanda è ancora in esecuzione? Sto eseguendo Go 1.5 su Ubuntu 14.
Quindi, SIGCHLD viene inviato dai processi figlio appena prima che diventino Zombi? Allora come si "ignora" SIGCHLD? Prendendo il segnale e facendo nulla? – AJPennster
SIGCHLD viene inviato dal kernel quando un bambino fa parte di renderlo uno zombie. Se vuoi ignorare SIGCHLD e ottenere ancora zombi, imposta l'azione SIGCHLD su SIG_DFL (il valore predefinito) anziché su SIG_IGN - l'azione predefinita è non fare nulla, ma ottenere comunque zombi. –
Non voglio gli zombi, voglio che i processi usciti siano ripuliti. Ho provato a impostare i segnali nell'applicazione principale per ignorare SIGCHLD e questo ha reso gli zombi quindi ho finito per chiamare Wait(). – AJPennster