Tôi có một ứng dụng trong Go để định tuyến lại STDIN và STDOUT của các tệp nhị phân và sau đó chạy chúng. Tóm lại tôi đang làm:Golang: Quá trình con trở thành Zombies
- 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
tôi nhận thấy bất cứ khi nào quy trình thoát lệnh B trong khi lệnh A được chạy, nó trở thành một quá trình zombie trong bảng quá trình.
Dưới đây là một ví dụ:
commandA := exec.Command("samplebin")
commandB := exec.Command("sample2bin")
cmdAStdin := commandA.StdinPipe()
commandB.Stdout = cmdAStdin
commandA.Start()
commandB.Start()
Tại sao commandB trở thành một Zombie nếu nó thoát trong khi commandA vẫn chạy? Tôi đang chạy Go 1.5 trên Ubuntu 14.
Vì vậy, SIGCHLD được gửi bởi quy trình con ngay trước khi chúng trở thành Zombies? Sau đó, làm thế nào để "bỏ qua" SIGCHLD? Bằng cách bắt tín hiệu và không làm gì cả? – AJPennster
SIGCHLD được gửi bởi hạt nhân khi một đứa trẻ như là một phần của làm cho nó một zombie. Nếu bạn muốn bỏ qua SIGCHLD và vẫn nhận được zombie, hãy đặt hành động SIGCHLD thành SIG_DFL (mặc định) thay vì SIG_IGN - hành động mặc định là không làm gì cả, nhưng vẫn nhận được zombie. –
Tôi không muốn các Zombies, tôi muốn các quá trình thoát được làm sạch. Tôi đã thử thiết lập các tín hiệu trong ứng dụng chính để bỏ qua SIGCHLD và vẫn tạo ra các thây ma vì vậy tôi sẽ gọi Wait(). – AJPennster