[英]Interrupt command line execution in Fortran without killing main program
我有一个Fortran程序,可以对许多不同的输入数据运行一系列相同的计算。 完成这些计算后,代码始终会编写一个GNUplot脚本,该脚本会进行一些诊断绘图(没有什么困难),并在Linux中使用execute_command_line
运行它。
这通常可以很好地工作,但是一段时间之后,我认为必须存在某种可以累积的内存泄漏,因为GNUplotting越来越慢。 在某个时候,它几乎停滞了。
因此,我的问题是: 是否可以使用键盘中断对execute_command_line
的调用而不会杀死Fortran主程序 ? 不用说, CTRL-C
杀死了所有东西,这不是我想要的:我希望主程序继续运行。
我一直在玩可选标志wait=.true.
但这无济于事。
另外,我知道必须修复内存泄漏(或任何原因),但是现在我想首先查看诊断输出。
我唯一能提出的解决方案是一种解决方法:
修改外壳脚本,使其
./mpirun prog_name options &
proc_PID=$!
wait $proc_PID
trap handler SIGINT
SIGURS1
信号: function handler() { kill -SIGUSR1 $proc_PID }
修改Fortran代码,使其捕获SIGUSR1信号并对其执行所需的操作。 例如,在这里看看。
通过在后台运行mpi
进程,您可以避免使用无法捕获的 SIGINT
杀死mpirun
,而是发送SIGURS1
,该SIGURS1
可以正确传播到可以直接处理的mpi
进程。
但是,作为附带说明,我意识到这无法解决我的问题,因为我的问题与使用execute_command_line
外部调用gnuplot
有关。 由于我发生了累积的内存泄漏,因此在某个时候,由于内存资源变得稀缺,此调用永远开始进行。 因此,我唯一能做的就是手动杀死gnuplot
进程。
当然,更好的办法是修复内存泄漏,这是我做的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.