【问题标题】:Keep forked process alive if parent/child exits abnormally (C++)如果父/子异常退出(C ++),则保持分叉进程处于活动状态
【发布时间】:2011-08-23 14:07:20
【问题描述】:

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

// 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]:是的,主进程正在写入命令行正在读取的文件,但它是一个普通文件,而不是管道。我收到一个段错误。

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

【问题讨论】:

  • 根据您发布的内容,我不明白为什么您的主程序会死掉。这是真的发生还是您担心会发生什么?
  • 除非父子进程以某种方式交互,否则子进程的死亡不太可能影响父进程。父母是否通过管道从/向孩子读/写?您可能收到 SIGPIPE 信号吗?还是其他信号?
  • @Duck,但它确实发生了......所以你认为这是正确的做法吗?
  • @Luther Blissett:感谢您的回复。是的,主进程正在写入命令行正在读取的文件,但它是一个普通文件,而不是管道。我收到一个段错误。
  • @usfish:你在使用文件锁定吗?

标签: c++ linux process exec fork


【解决方案1】:

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

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

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

【讨论】:

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

    【讨论】:

    • POSIX 有 posix_spawn() 替换 vfork()
    猜你喜欢
    • 2019-01-27
    • 1970-01-01
    • 2020-06-22
    • 2016-03-15
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-03-14
    • 1970-01-01
    相关资源
    最近更新 更多