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

Using system("./some_program"), how to prevent termination of parent process when "some_program" dies?

本文关键字:program some 何防止 进程 终止 system 使用      更新时间:2023-10-16

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

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

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

谢谢

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

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

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

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

溶液: 简而言之,在确保出现可重现的错误(使用 MPI 进行调试超出了我的范围)后,我启动了 gdb 并以串行模式仔细分析了原始代码。我发现该程序试图访问一个未初始化的向量,这导致了"out_of_range"错误,父程序立即退出。这让我感到困惑的原因是,当外部程序中止时,这种取消初始化就会发生 - 这就是为什么我认为它与外部程序的实际终止过程有关,而问题要简单得多。

谢谢大家!