gpt4 book ai didi

戈朗 : Child Processes become Zombies

转载 作者:IT王子 更新时间:2023-10-29 01:10:47 25 4
gpt4 key购买 nike

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

- 使用二进制路径创建命令对象(让调用对象命令 A)
- 使用二进制路径创建命令对象(将其称为命令 B)
- 将命令 B 的标准输出设置为命令 A 的标准输入
- 启动命令 A
- 启动命令 B

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

这是一个例子:

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

cmdAStdin := commandA.StdinPipe()

commandB.Stdout = cmdAStdin

commandA.Start()
commandB.Start()

为什么 commandB 在 commandA 仍在运行时退出会变成 Zombie?我在 Ubuntu 14 上运行 Go 1.5。

最佳答案

当一个进程退出时,它总是变成僵尸,不管其他进程在运行什么。这就是进程终止的工作方式。该进程将保持僵尸状态,直到其父进程调用 wait 获取其退出状态,或通过忽略 SIGCHLD(可能在子进程退出之前)表明它对子进程不感兴趣。在这种情况发生之前,它将保持僵尸状态,以免退出状态丢失。

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

如果一个进程在它仍然有子进程(正在运行或僵尸)时退出,这些子进程将重新成为退出进程的父进程的父级,这通常会忽略退出状态(清除僵尸)。

关于戈朗 : Child Processes become Zombies,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36050503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com