如果父/子异常退出,则保持分叉进程存活(C ++)

时间:2011-05-11 19:17:28

标签: c++ linux process exec fork

我正在尝试与当前进程并行执行另一个命令行进程。但是,我意识到命令行程序有时会异常退出,并且也会杀死我的主程序。

// 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);
}

在命令行程序异常死亡后,有没有办法让我的主程序继续运行?谢谢!

[更新]:是的,主要进程是写入命令行正在读取的文件,但它是普通文件,而不是管道。我收到了段错误。

我很难重现错误,因为子进程不会经常崩溃。但它确实发生了。随机崩溃是命令行程序中的一个已知错误,这就是为什么我想保持我的主程序活着,即使命令行死了。

2 个答案:

答案 0 :(得分:1)

在您的真实代码中,您还有其他地方:

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

在这里提问时,发布实际代码总是一个好主意。

答案 1 :(得分:1)

  • 使用vfork而不是fork来避免不必要的进程克隆。
  • 确保父进程收到SIGCHLD时不会崩溃。
  • 使用正确的if-then-else语句来明确父进程中执行的代码以及子进程中发生的情况。例如,很可能子进程和进程都会执行// DO OTHER STUFF HERE.注释execv失败的代码。
  • 毕竟,请使用gdb。它会告诉你发生崩溃的地方。