使用system(“ ./ some_program”),当“ some_program”死时如何防止父进程终止?

时间:2019-06-10 12:31:52

标签: c++ linux

在Linux下,我有一个C ++代码来调用外部程序(已编译的Fortran程序)。此外部程序有时会中止(即,在满足某些条件时,其代码中会发出“ STOP”),这是可以的。但是:外部程序终止也会杀死父C ++程序。 我希望C ++代码继续运行,即使外部程序正常或异常停止执行也是如此。

C ++“父”程序使用system(“ ./ external_program”)执行外部程序。

[注意:是的,我知道使用system()存在安全问题,但目前与我无关]

谢谢

常规信息:C ++程序使用MPI进行并行执行,并启动N个外部程序的并行实例-每个实例在其自己的目录中。

两个程序终止时的错误消息: 主作业正常终止,但是1个进程返回了非零的退出代码。按照用户的指示,作业已中止。

mpirun注意到,节点Ashton上PID为0的进程等级为18的信号6(已终止)退出。

1 个答案:

答案 0 :(得分:1)

好消息:问题已解决! 遵循@Ted Lyngmo的建议,我基本上编写了2个新代码,它们假定是模仿原始2个代码的操作,而这两个代码太大了,无法提取最小的可重现示例。令人惊讶的是,新示例中没有这个问题!这当然提示我,主程序终止的原因不是外部程序中的中止信号。

解决方案: 简而言之,我启动gdb并在确保得到可重现的错误(使用MPI进行调试超出了我的能力)之后,以串行模式仔细分析了原始代码。我发现该程序尝试访问未初始化的向量,从而导致“ out_of_range”错误,并且父程序立即退出。令我感到困惑的原因是,这种未初始化是在外部程序中止时发生的-这就是为什么我认为这与外部程序的实际终止过程有关,而这个问题要简单得多。

谢谢大家!