2011-05-11 19 views
3

現在のプロセスと並行して別のコマンドラインプロセスを実行しようとしています。しかし、私は、コマンドラインプログラムが時々異常に終了し、それが私のメインプログラムも殺すことを認識しています。親子が異常終了した場合、フォークされたプロセスが生き続ける(C++)

// MAIN PROGRAM 
pid = fork(); 
char *argv[] = { stuff.. }; 
if (pid == 0) { 
    int rc = execv("command line program...", argv); 
    } 

// DO OTHER STUFF HERE. 

if (pid > 0) { 
    waitpid(pid, 0, 0); 
} 

コマンドラインプログラムが異常死んだ後、私のメインプログラムの実行を維持する方法はありますか?ありがとう!

[UPDATE]:はい、メインプロセスはコマンドラインの読み込み元のファイルに書き込みますが、パイプではなく通常のファイルです。私はsegfaultを受け取ります。

子プロセスが非常に頻繁にクラッシュすることはないので、バグを再現することは非常に難しいです。しかしそれは起こる。無作為にクラッシュするのは、コマンドラインプログラムの既知のバグです。そのため、コマンドラインが消滅しても私のメインプログラムを生かしておきたいのです。あなたの本当のコードで

+0

あなたが投稿した内容に基づいて、あなたのメインプログラムがなぜ死ぬのかわかりません。これは実際に起こっているのか、起こっていることについて心配しているのでしょうか? – Duck

+1

親と子が何らかの形で相互作用している場合を除き、子プロセスの死が親プロセスに影響を及ぼす可能性は低いです。親はパイプを介して子供との間で読み書きをしていますか?あなたはおそらくSIGPIPEシグナルを得ていますか?または他の信号? –

+0

@Duck、しかしそれは実際に起こる...だから、これは正しい方法だと思いますか? – CodeNoob

答えて

1

は、あなたが他にここに持っている:

if (pid == 0) { 
    int rc = execv("command line program...", argv); 
    // possibly more child stuff 
} 
else { 
    // parent stuff 
} 

それは常にここに質問をしたときに実際のコードをポストすることをお勧めします。

1
  • 不要なプロセスの複製を避けるため、forkではなくvforkを使用してください。
  • SIGCHLDが親プロセスによって受信されたときにクラッシュしないことを確認してください。
  • 適切なif-then-elseステートメントを使用して、親プロセスでどのコードが実行され、子プロセスで何が実行されるのかを明確にします。例えば、// DO OTHER STUFF HERE.コメントがある場合、子プロセスとプロセスの両方でコードが実行され、execvが失敗する可能性が非常に高いです。
  • 最後に、gdbを使用してください。クラッシュの発生場所を教えてくれます。
+0

私は、vforkはAPUE(Stevens、Rago)による全てのUnixoidシステム上には存在しないことに注意しなければならないと思いますが、これはLinuxやその他の普遍的なUNIXシステム上で行われます。 – 0xC0000022L

+0

POSIXは 'vfork()'を置き換える 'posix_spawn()'を持っています。 – ninjalj

関連する問題