2

我有一个使用 Popen 调用 shell 脚本的 C++ pthread 线程。

在一种情况下观察到的是 pthread_join 失败被捕获(即 pthread_join != 0)并且子进程保持为僵尸(根据 ps 输出)。

这也会导致主程序挂起。

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

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

提前致谢..

4

1 回答 1

1

调用之后popen,需要有对应的调用pclose,否则调用产生的子进程popen会一直处于僵尸状态。可能发生的情况是线程遇到了导致pclose无法调用的未处理异常,从而导致僵尸和pthread_join.

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

另一种解决方案是实现类似于popen()但不需要pclose()收割僵尸的东西。这可以通过使用双叉来完成。你打电话fork(),然后再打电话之前再打电话exec()。父进程允许中间子进程退出并使用wait4(). 孙子进程现在可以退出而不会留下僵尸,因为它将被该init进程收割。要在孙子和父母之间创建沟通渠道,请pipe()按原样使用popen(),或者socketpair()如果您需要双向沟通。在孙进程中使用dup2()以允许您在调用之前通过管道或套接字重定向您对stdinstdout和的选择stderrexec().

于 2012-06-03T16:31:16.457 回答