Golang:Child Processes成为Zombies
发布时间:2020-12-16 19:23:01 所属栏目:大数据 来源:网络整理
导读:我在Go中有一个应用程序重新路由二进制文件的STDIN和STDOUT,然后运行它们.简而言之,我正在做: – 使用二进制路径创建命令对象(让我们调用对象命令A) – 使用二进制路径创建命令对象(将其命名为命令B) – 将命令B的stdout设置为命令A的stdin – 启动命令A.
我在Go中有一个应用程序重新路由二进制文件的STDIN和STDOUT,然后运行它们.简而言之,我正在做:
– 使用二进制路径创建命令对象(让我们调用对象命令A) 我注意到,当命令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都将保留为僵尸,直到您的进程收集它们. 如果一个进程在仍有子进程(运行或僵尸)时退出,那么这些子进程将被重新分配给退出进程的父进程,这通常会忽略退出状态(清除僵尸). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |