我有一个C ++并行线程调用线程使用POPEN shell脚本。
在什么情况下一个观察是,在pthread_join失败被捕获(即在pthread_join!= 0)和子进程仍然是僵尸(按照ps的输出)。
这也导致主程序挂起。
现在,我不知道为什么在pthread_join会失败,因为它从来没有在其他场景一样。
不过,我想知道是否收集由POPEN催生子进程的等待状态是thread_join的一部分。 如果是这样至少我可以肯定的是,连接失败的根本原因僵尸和程序挂起..
提前致谢..
我有一个C ++并行线程调用线程使用POPEN shell脚本。
在什么情况下一个观察是,在pthread_join失败被捕获(即在pthread_join!= 0)和子进程仍然是僵尸(按照ps的输出)。
这也导致主程序挂起。
现在,我不知道为什么在pthread_join会失败,因为它从来没有在其他场景一样。
不过,我想知道是否收集由POPEN催生子进程的等待状态是thread_join的一部分。 如果是这样至少我可以肯定的是,连接失败的根本原因僵尸和程序挂起..
提前致谢..
打完电话后popen
,需要有相应的调用pclose
,另有催生子进程popen
通话将保持在僵尸状态。 到底发生了什么是线程遇到导致未处理的异常pclose
不被调用,从而导致僵尸和一个“失败”的结果pthread_join
。
一个解决办法是,以确保您的代码正确处理所有可能的异常。
另一个解决方案是实现类似的东西,以popen()
但不要求pclose()
收获僵尸。 这可以通过使用一个双叉来实现。 你调用fork()
,然后再调用之前调用它exec()
父进程允许中间子进程退出,并与被收割wait4()
孙子过程现在可以退出,不留一具僵尸,因为它会在被收获init
进程。 要创建孙子和家长,使用之间的通信通道pipe()
为popen()
呢,还是socketpair()
如果你需要双向通信。 使用dup2()
在孙子的过程,让您的选择stdin
, stdout
和stderr
致电前,通过管道或插座被重定向exec()