Golang:Child Processes成为Zombies

前端之家收集整理的这篇文章主要介绍了Golang:Child Processes成为Zombies前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在Go中有一个应用程序重新路由二进制文件的STDIN和STDOUT,然后运行它们.简而言之,我正在做:

– 使用二进制路径创建命令对象(让我们调用对象命令A)
– 使用二进制路径创建命令对象(将其命名为命令B)
– 将命令B的stdout设置为命令A的stdin
– 启动命令A.
– 启动命令B.

我注意到,当命令A运行时,只要命令B的进程退出,它就会成为进程表中的僵尸进程.

这是一个例子:

commandA := exec.Command("samplebin")
commandB := exec.Command("sample2bin")

cmdAStdin := commandA.StdinPipe()

commandB.Stdout = cmdAStdin

commandA.Start()
commandB.Start()

如果在命令A仍在运行时它退出,为什么commandB会成为僵尸?我在Ubuntu 14上运行Go 1.5.

当一个进程退出时,它总是变成一个僵尸,无论其他进程正在运行.这就是流程终止的工作方式.该过程将保持僵尸状态,直到其父级呼叫等待获得其退出状态,或通过忽略SIGCHLD(可能在孩子退出之前)指示它对孩子不感兴趣.它将保持僵尸,直到发生这种情况,以免退出状态丢失.

在您的示例中,您的进程(创建进程的进程)似乎是父进程,因此A和B都将保留为僵尸,直到您的进程收集它们.

如果一个进程在仍有子进程(运行或僵尸)时退出,那么这些子进程将被重新分配给退出进程的父进程,这通常会忽略退出状态(清除僵尸).

猜你在找的Go相关文章