我有一个C ++ pthread Thread使用Popen调用shell脚本。
在一个案例中观察到的是捕获了pthread_join失败(即pthread_join!= 0)并且子进程仍然是僵尸(根据ps输出)。
这也会导致主程序挂起。
现在,我不知道为什么pthread_join会失败,因为它在其他情况下从未发生过。
但我想知道收集Popen产生的子进程的等待状态是否是thread_join的一部分。如果是这样至少我可以确定连接失败是僵尸和程序挂起的根本原因..
提前致谢..
答案 0 :(得分:1)
调用popen
后,需要对pclose
进行相应的调用,否则popen
调用产生的子进程将保持僵尸状态。可能发生的是线程遇到未处理的异常导致pclose
未被调用,导致僵尸和pthread_join
的“失败”结果。
一种解决方案是确保您的代码正确处理所有可能的异常。
另一个解决方案是实现与popen()
类似的内容,但不需要pclose()
来获取僵尸。这可以通过使用双叉来完成。您拨打fork()
,然后在致电exec()
之前再次拨打电话。父进程允许中间子进程退出并使用wait4()
获得。孙子进程现在可以在不离开僵尸的情况下退出,因为它将由init
进程获得。要在孙子和父级之间创建通信通道,请使用pipe()
作为popen()
,或socketpair()
,如果您需要双向通信。在孙子进程中使用dup2()
,允许您在调用stdin
之前通过管道或套接字重定向stdout
,stderr
和exec()
。< / p>