在Fortran中断命令行而不杀死主程序

时间:2015-06-29 14:12:55

标签: linux fortran

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

这通常效果很好,但过了一段时间后我认为必须存在某种累积的内存泄漏,因为GNUplotting变得越来越慢。在某些时候它几乎停滞不前。

因此我的问题是:是否可以使用键盘中断对execute_command_line的调用而不会杀死主要的Fortran程序?毋庸置疑,CTRL-C杀死了一切,这不是我想要的:我希望主程序能够继续。

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

另外,我知道必须修复内存泄漏(或者无论原因是什么),但是现在我想先看看诊断输出。

1 个答案:

答案 0 :(得分:0)

我能够提出的唯一解决方案是一种解决方法:

  • 修改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进程,您可以避免使用mpirun SIGINT查找SIGURS1cannot be trapped但是您发送的是mpi,这是正确的传播到gnuplot进程,可以直接处理它。

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

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