pthread_join失败会导致子进程成为僵尸吗?

时间:2012-06-03 13:06:44

标签: c++ pthreads zombie-process

我有一个C ++ pthread Thread使用Popen调用shell脚本。

在一个案例中观察到的是捕获了pthread_join失败(即pthread_join!= 0)并且子进程仍然是僵尸(根据ps输出)。

这也会导致主程序挂起。

现在,我不知道为什么pthread_join会失败,因为它在其他情况下从未发生过。

但我想知道收集Popen产生的子进程的等待状态是否是thread_join的一部分。如果是这样至少我可以确定连接失败是僵尸和程序挂起的根本原因..

提前致谢..

1 个答案:

答案 0 :(得分:1)

调用popen后,需要对pclose进行相应的调用,否则popen调用产生的子进程将保持僵尸状态。可能发生的是线程遇到未处理的异常导致pclose未被调用,导致僵尸和pthread_join的“失败”结果。

一种解决方案是确保您的代码正确处理所有可能的异常。

另一个解决方案是实现与popen()类似的内容,但不需要pclose()来获取僵尸。这可以通过使用双叉来完成。您拨打fork(),然后在致电exec()之前再次拨打电话。父进程允许中间子进程退出并使用wait4()获得。孙子进程现在可以在不离开僵尸的情况下退出,因为它将由init进程获得。要在孙子和父级之间创建通信通道,请使用pipe()作为popen(),或socketpair(),如果您需要双向通信。在孙子进程中使用dup2(),允许您在调用stdin之前通过管道或套接字重定向stdoutstderrexec()。< / p>