pthread_连接失败是否会导致子进程成为僵尸? 我有一个C++ p螺纹线程使用Popen调用shell脚本。

pthread_连接失败是否会导致子进程成为僵尸? 我有一个C++ p螺纹线程使用Popen调用shell脚本。,c++,pthreads,zombie-process,C++,Pthreads,Zombie Process,在一种情况下观察到的情况是,捕获到pthread_join失败(即pthread_join!=0),并且子进程仍然是僵尸(根据ps输出) 这也会导致主程序挂起 现在,我不知道为什么pthread_连接会失败,因为它在其他场景中从未失败过 但是我想知道收集Popen生成的子进程的等待状态是否是thread_join的一部分。如果是这样,我至少可以确定连接失败是僵尸和程序挂起的根本原因 提前感谢..在调用popen之后,需要有一个对pclose的相应调用,否则由popen调用生成的子进程将保持僵死状

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

这也会导致主程序挂起

现在,我不知道为什么pthread_连接会失败,因为它在其他场景中从未失败过

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


提前感谢..

在调用
popen
之后,需要有一个对
pclose
的相应调用,否则由
popen
调用生成的子进程将保持僵死状态。可能发生的情况是,线程遇到未处理的异常,导致无法调用
pclose
,从而导致僵死和
pthread\u join
的“失败”结果

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


另一个解决方案是实现类似于
popen()
的东西,但不需要
pclose()
来捕获僵尸。这可以通过使用双叉来实现。调用
fork()
,然后在调用
exec()
之前再次调用它。父进程允许中间子进程退出并使用
wait4()
获取。孙子进程现在可以退出而不留下僵尸,因为它将被
init
进程获取。要在孙辈和父辈之间创建通信通道,请使用
pipe()
popen()
一样,或者如果需要双向通信,请使用
socketpair()
。在孙子进程中使用
dup2()
,允许在调用
exec()
之前通过管道或套接字重定向您的
stdin
stdout
stderr
选择是的,我已经考虑过了。然而,pthread_join被封装为一个公共库。我把它推迟到下一次考试了……嗯,这似乎有道理。因为只有当底层套接字引发异常时,才会发生此连接失败。但是try-catch捕获了连接失败。。我将检查是否是pclose案例并更新条件。我有一个疑问。如果我的主进程有一个SIGCHLD信号处理程序并实现了等待,那么即使加入失败,僵尸也不会被移除吗?我接受你的回答,因为这帮助我解决了问题。前一个线程的异常在其联接后被处理,该线程留在一个列表中,当当前线程完成时,该列表将被再次遍历以进行联接。再次加入会导致失败,因此该线程永远不会加入,从而导致僵尸进程和进程挂起。。谢谢:)