Golang:子进程变成僵尸

我在Go中有一个应用程序,它可以重新路由二进制文件的STDIN和STDOUT,然后运行它们。简而言之,我正在做:

- 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

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

这是一个例子:

commandA := exec.Command("samplebin")

commandB := exec.Command("sample2bin")

cmdAStdin := commandA.StdinPipe()

commandB.Stdout = cmdAStdin

commandA.Start()

commandB.Start()

如果commandB仍在运行时退出,为什么commandB会变成僵尸?我在Ubuntu 14上运行Go 1.5。

回答:

当某个进程退出时,无论正在运行什么其他进程,它 总是

成为僵尸。这就是进程终止的方式。该进程将一直保持僵尸wait状态,直到其父级调用以获取其退出状态为止,或者通过忽略SIGCHLD(可能在子级退出之前就对它表示不感兴趣)表明该进程对子级不感兴趣。在发生这种情况之前,它将一直是僵尸,以免退出状态迷路。

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

如果某个进程在仍然有子进程(正在运行或僵尸)的情况下退出,则这些子进程将重新成为退出进程的父进程的父进程,而该进程的父进程通常会忽略退出状态(清理僵尸进程)。

以上是 Golang:子进程变成僵尸 的全部内容, 来源链接: utcz.com/qa/430191.html

回到顶部