2

Popenを使用してシェルスクリプトを呼び出すC++pthreadスレッドがあります。

あるケースで観察されるのは、pthread_joinの失敗がキャッチされ(つまり、pthread_join!= 0)、子プロセスがゾンビのままである(ps出力による)ことです。

これにより、メインプログラムもハングします。

今のところ、pthread_joinが失敗する理由はわかりません。これは、他のシナリオでは失敗しなかったためです。

しかし、Popenによって生成された子プロセスの待機ステータスの収集がthread_joinの一部であるかどうかを知りたいです。少なくともそうであれば、結合の失敗がゾンビの根本的な原因であり、プログラムがハングすることを確信できます。

前もって感謝します..

4

1 に答える 1

1

を呼び出した後popen、に対応する呼び出しが必要pcloseです。そうでない場合、呼び出しによって生成された子プロセスはpopenゾンビ状態のままになります。発生した可能性があるのは、スレッドが未処理の例外に遭遇したpcloseために呼び出されなかったため、ゾンビが発生し、結果が「失敗」したことですpthread_join

1つの解決策は、コードがすべての可能な例外を適切に処理することを確認することです。

別の解決策は、ゾンビを刈り取るのに似ているpopen()が、それを必要としないものを実装することです。これは、ダブルフォークpclose()を使用して実行できます。を呼び出してから、を呼び出す前にもう一度呼び出します。親プロセスを使用すると、中間の子プロセスを終了して、で刈り取ることができます。孫プロセスは、プロセスによって刈り取られるため、ゾンビを離れることなく終了できるようになりました。孫と親の間に通信チャネルを作成するには、そのまま使用するか、双方向通信が必要な場合に使用します。孫プロセスで使用して、、、の選択を許可し、呼び出す前にパイプまたはソケットを介してリダイレクトできるようにしますfork()exec()wait4()initpipe()popen()socketpair()dup2()stdinstdoutstderrexec()

于 2012-06-03T16:31:16.457 に答える