我在Go中有一個應用程序,用於重新路由二進制文件的STDIN和STDOUT,然後運行它們。概括地說,我做的:Golang:子進程成爲殭屍
- 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仍在運行?我在Ubuntu 14上運行Go 1.5。
那麼,SIGCHLD是由子進程發送之前,他們成爲殭屍?那麼如何「忽略」SIGCHLD?通過捕捉信號而無所作爲? – AJPennster
當兒童作爲殭屍的一部分時,內核發送SIGCHLD。如果你想忽略SIGCHLD並且仍然獲得殭屍,那麼將SIGCHLD動作設置爲SIG_DFL(默認值)而不是SIG_IGN--默認動作是什麼都不做,但仍然會獲得殭屍。 –
我不想殭屍,我想要清理退出的進程。我試圖在主應用程序中設置信號來忽略SIGCHLD,並且仍然製作殭屍,所以我最終調用了Wait()。 – AJPennster