我有一个Fortran程序,它对许多不同的输入数据运行一系列相同的计算。在进行这些计算之后,代码总是编写一个GNUplot脚本来执行一些诊断绘图(没什么太困难)并在Linux中使用execute_command_line
运行它。
这通常效果很好,但过了一段时间后我认为必须存在某种累积的内存泄漏,因为GNUplotting变得越来越慢。在某些时候它几乎停滞不前。
因此我的问题是:是否可以使用键盘中断对execute_command_line
的调用而不会杀死主要的Fortran程序?毋庸置疑,CTRL-C
杀死了一切,这不是我想要的:我希望主程序能够继续。
我一直在玩可选标志wait=.true.
,但这没有帮助。
另外,我知道必须修复内存泄漏(或者无论原因是什么),但是现在我想先看看诊断输出。
答案 0 :(得分:0)
我能够提出的唯一解决方案是一种解决方法:
修改shell脚本以便
./mpirun prog_name options &
proc_PID=$!
wait $proc_PID
trap handler SIGINT
SIGURS1
信号:function handler() { kill -SIGUSR1 $proc_PID }
修改Fortran代码,以便捕获SIGUSR1信号并使用它执行您想要的操作。例如,看一看here。
通过在后台运行mpi
进程,您可以避免使用mpirun
SIGINT
查找SIGURS1
,cannot be trapped但是您发送的是mpi
,这是正确的传播到gnuplot
进程,可以直接处理它。
但是,作为旁注,我意识到这不会解决我的问题,因为我的问题与使用execute_command_line
的{{1}}外部呼叫有关。由于我有一个累积的内存泄漏,在某些时候这个调用开始采取永远,因为内存资源变得稀缺。所以我唯一能做的就是手动终止gnuplot
进程。
当然,更好的是修复内存泄漏,我做了。