2009-08-03 19 views
5

私は他の外部プロセスを実行しなければならないプログラムを書いています。現在、プログラムはpopenを介してプロセスのコマンドラインを起動し、出力を取得した後、pcloseを介して終了ステータスを取得します。popen/pcloseの代替手段ですか?

しかし、何が起こっているのかは、実行中のプロセス(例えば、起動されたプロセスのエラーが素早く消滅した場合など)ではpclose呼び出しが終了ステータスを取得できないことです(pcloseは-1を返し、errnoはECHILDです)。

popen/pclose型の動作を模倣する方法はありますか?ただし、プロセス終了の "イベント"とその結果の戻りコードの取得を保証する方法はありますか? pcloseの固有の競合状態と起動プロセスの終了を避けるにはどうすればよいですか?

答えて

3

フォーク/ execの/

popenのを待つには、フォーク/ execの呼び出しを簡素化するだけのラッパーです。子の出力を取得するには、パイプを作成し、forkを呼び出し、子のファイル記述子をパイプにdupしてから、execする必要があります。親はパイプからの出力を読み、子の終了ステータスを取得するためにwaitを呼び出すことができます。

+4

ポケモンは、フォークを持たないウィンドウで使用できるので、明らかに必ずしもラッパーではありません。 –

+0

私はこれを行うコード(fork/exec/dup/etc。)を書き直しましたが、今度はwaitpid(...)を断続的に失敗させて-1/errno = ECHILDを返します。クラップ – Joe

+3

Ok:これを分かりました。このコードは素晴らしいです。 popen/pcloseの私の古いコードはうまくいきます。うまくいかなかったのは、継承した共通コードに埋め込まれた隠されたSIGCHLDハンドラでした。ああスナップ。私は基本的にそのハンドラ(単にwaitpid(-1、...)を呼び出していた)と競合していました。習得したこと:すべてのマニュアルページを読んで、何も想定してはいけません! – Joe

1

vfork()とexecv()を使用できます。