pthread_连接失败是否会导致子进程成为僵尸? 我有一个C++ p螺纹线程使用Popen调用shell脚本。
在一种情况下观察到的情况是,捕获到pthread_join失败(即pthread_join!=0),并且子进程仍然是僵尸(根据ps输出) 这也会导致主程序挂起 现在,我不知道为什么pthread_连接会失败,因为它在其他场景中从未失败过 但是我想知道收集Popen生成的子进程的等待状态是否是thread_join的一部分。如果是这样,我至少可以确定连接失败是僵尸和程序挂起的根本原因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调用生成的子进程将保持僵死状
提前感谢..在调用
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信号处理程序并实现了等待,那么即使加入失败,僵尸也不会被移除吗?我接受你的回答,因为这帮助我解决了问题。前一个线程的异常在其联接后被处理,该线程留在一个列表中,当当前线程完成时,该列表将被再次遍历以进行联接。再次加入会导致失败,因此该线程永远不会加入,从而导致僵尸进程和进程挂起。。谢谢:)