是否在pthread_join故障原因的子进程是僵尸?(Does pthread_join fail

2019-07-29 17:37发布

我有一个C ++并行线程调用线程使用POPEN shell脚本。

在什么情况下一个观察是,在pthread_join失败被捕获(即在pthread_join!= 0)和子进程仍然是僵尸(按照ps的输出)。

这也导致主程序挂起。

现在,我不知道为什么在pthread_join会失败,因为它从来没有在其他场景一样。

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

提前致谢..

Answer 1:

打完电话后popen ,需要有相应的调用pclose ,另有催生子进程popen通话将保持在僵尸状态。 到底发生了什么是线程遇到导致未处理的异常pclose不被调用,从而导致僵尸和一个“失败”的结果pthread_join

一个解决办法是,以确保您的代码正确处理所有可能的异常。

另一个解决方案是实现类似的东西,以popen()但不要求pclose()收获僵尸。 这可以通过使用一个双叉来实现。 你调用fork() ,然后再调用之前调用它exec() 父进程允许中间子进程退出,并与被收割wait4() 孙子过程现在可以退出,不留一具僵尸,因为它会在被收获init进程。 要创建孙子和家长,使用之间的通信通道pipe()popen()呢,还是socketpair()如果你需要双向通信。 使用dup2()在孙子的过程,让您的选择stdinstdoutstderr致电前,通过管道或插座被重定向exec()



文章来源: Does pthread_join failure cause child process to be zombies?