繁体   English   中英

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

[英]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. 但这无济于事。

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

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

  • 修改外壳脚本,使其

    • 在后台运行Fortran程序: ./mpirun prog_name options &
    • 获取此过程的PID: 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM