当前位置: 首页 > 面试题库 >

Golang:子进程变成僵尸

朱岳
2023-03-14
问题内容

我在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都将保留为僵尸,直到您的进程收集它们为止。

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



 类似资料:
  • 僵尸进程 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。 一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程。 理解了孤儿进程和僵尸进程,我们临时加了守护进程这一小节,守护进程就是后台进程吗?没那么简单。

  • 本文向大家介绍Shell脚本实现查杀子进程、僵尸进程,包括了Shell脚本实现查杀子进程、僵尸进程的使用技巧和注意事项,需要的朋友参考一下 核心服务器上跑了一堆的脚本、程序,难免有时候会出现僵尸进程,死不死活不活的在那里占用资源,最初只是写了个根据关键字查杀进程的linux shell脚本,后来发现很多时候进程死在那里的时候其实是内部调用子进程的时候出现了问题,这时候光杀父进程根本没解决根本问题。

  • 问题内容: 我在前台启动了我的程序(守护程序),然后用杀死了它,但剩下一个僵尸,无法用杀死它。如何杀死僵尸进程? 如果僵尸是一个死进程(已被杀死),我如何将其从输出中删除? 问题答案: 僵尸已经死了,所以您无法杀死它。要清理僵尸,必须等待其父级等待,因此杀死父级应该可以消除僵尸。(父对象死后,僵尸将被pid 1继承,而pid 1将等待该僵尸并清除其在进程表中的条目。)如果守护程序正在生成成为僵尸的

  • 问题内容: 维基百科说:“一个终止但从未被其父级等待的子进程变成了僵尸进程。” 我运行此程序: 这会创建一个僵尸进程,但我不明白为什么在这里创建了僵尸进程? 该程序的输出是 但是在这种情况下,为什么“子进程终止但没有被其父进程等待”呢? 问题答案: 在您的代码中,创建了僵尸(带有以下箭头的注释): 为什么?因为你从来没有上过。调用时,它将返回有关进程的事后信息,例如其退出代码。不幸的是,当进程退出

  • 本文向大家介绍请你说一下僵尸进程?相关面试题,主要包含被问及请你说一下僵尸进程?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 1)正常进程 正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程

  • 更多面试题总结请看:【面试题】技术面试题汇总 进程的状态 基本状态 进程的基本状态:“就绪”、“执行”、“阻塞”。 就绪:进程已获得除处理机以外的所需资源,等待分配处理机资源 执行:进程正在占用处理机资源执行 阻塞:进程等待某种条件,在条件满足之前无法执行。如发起了 I/O 系统调用,会被阻塞,等待 I/O 中断发生 挂起 “挂起”是指将暂不执行的进程换出到外存,节省内存空间。 “挂起”和“阻塞”