如果父/子进程异常退出,如何保持分叉的进程运行(C++)

4

我正在尝试与当前进程并行执行另一个命令行进程。然而,我发现命令行程序有时会异常退出,这也会导致我的主程序停止运行。

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

有没有办法在命令行程序异常关闭后保持我的主程序运行?谢谢!
[更新]:是的,主进程正在写入一个文件,命令行程序正在从该文件中读取,但它是一个普通文件,而不是管道。我收到了一个段错误。
我很难复制这个错误,因为子进程并不经常崩溃。但确实会发生。随机崩溃是命令行程序中已知的错误,这就是为什么我希望即使命令行死掉,我的主程序也能继续运行的原因。

基于你发的信息,我看不出为什么你的主程序会崩溃。这实际上是否发生了,还是你担心它会发生? - Duck
1
除非父进程和子进程有某种交互,否则孩子的死亡不太可能影响父进程。父进程是否通过管道与子进程进行读/写操作?也许你收到了SIGPIPE信号?或者其他任何信号? - Nordic Mainframe
@Duck,这确实发生了...那么你认为这是正确的做法吗? - CuriousMind
@Luther Blissett:感谢您的回复。是的,主要进程是写入一个文件,而命令行从该文件中读取,但它是一个普通文件,而不是管道。我收到了一个段错误。 - CuriousMind
@usfish:你正在使用文件锁定吗? - 0xC0000022L
@STATUS_ACCESS_DENIED: 不是的。我已经更新了我的帖子,以更清楚地澄清问题。 - CuriousMind
2个回答

1
  • 使用vfork而不是fork,以避免不必要的进程克隆。
  • 确保在父进程接收到SIGCHLD时不会崩溃。
  • 使用适当的if-then-else语句,清楚地说明父进程中执行的代码和子进程中发生的情况。例如,很可能在execv失败的情况下,子进程和父进程都会执行// DO OTHER STUFF HERE.注释中的代码。
  • 最后,使用gdb。它会告诉你崩溃发生的位置。

我认为仍应该注意到,根据APUE(Stevens,Rago),并非所有的类Unix系统都存在vfork,尽管在Linux和一些其他流行的类Unix系统上存在。 - 0xC0000022L
POSIX有posix_spawn()来替代vfork() - ninjalj

1

在你的真实代码中,这里有一个 else 吗:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接