在不终止主程序的情况下中断 Fortran 中的命令行执行

Interrupt command line execution in Fortran without killing main program

我有一个 Fortran 程序,它对许多不同的输入数据运行一系列相同的计算。在完成这些计算之后,代码总是会编写一个 GNUplot 脚本来执行一些诊断绘图(没什么太难的)并使用 Linux.

中的 execute_command_line 运行它。

这通常运行良好,但一段时间后我认为一定存在某种累积的内存泄漏,因为 GNUPlotting 变得越来越慢。在某些时候它几乎停滞不前。

因此我的问题是:是否可以在不终止 Fortran 主程序的情况下使用键盘中断对 execute_command_line 的调用?不用说,CTRL-C 杀死一切,这不是我想要的:我希望主程序继续。

我一直在玩可选标志 wait=.true. 但这没有帮助。

此外,我知道必须修复内存泄漏(或任何原因),但现在我想先看看诊断输出。

我能想出的唯一解决办法是一种解决方法:

  • 修改 shell 脚本,使其

    • 在后台运行 Fortran 程序:./mpirun prog_name options &
    • 获取此进程的 PID:proc_PID=$!
    • 等待进程:wait $proc_PID
    • 捕获一个中断信号:trap handler SIGINT
    • 让处理程序发送一个 SIGURS1 信号:function handler() { kill -SIGUSR1 $proc_PID }
  • 修改 Fortran 代码,使其捕获 SIGUSR1 信号并使用它执行您想要的操作。例如看看 here.

通过 运行 后台的 mpi 进程,您可以避免用 SIGINT 杀死 mpiruncannot be trapped 但您发送的是 SIGURS1,它被正确地传播到可以直接处理的 mpi 进程。

然而,作为旁注,我意识到这不会解决我的问题,因为我的问题与使用 execute_command_linegnuplot 的外部调用有关。由于我有一个累积内存泄漏,在某个时候这个调用开始永远占用,因为内存资源变得稀缺。所以我唯一能做的就是手动终止 gnuplot 进程。

当然,更好的是修复内存泄漏,我也这样做了。