【问题标题】:Interrupt command line execution in Fortran without killing main program在 Fortran 中中断命令行执行而不杀死主程序
【发布时间】:2015-09-16 01:13:09
【问题描述】:

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

这通常效果很好,但一段时间后我认为一定有某种累积的内存泄漏,因为 GNUplotting 变得越来越慢。在某些时候,它实际上会停止。

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

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

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

【问题讨论】:

标签: linux fortran


【解决方案1】:

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

  • 修改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 进程。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2012-11-21
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多