在不终止主程序的情况下中断 Fortran 中的命令行执行
Interrupt command line execution in Fortran without killing main program
我有一个 Fortran 程序,它对许多不同的输入数据运行一系列相同的计算。在完成这些计算之后,代码总是会编写一个 GNUplot 脚本来执行一些诊断绘图(没什么太难的)并使用 Linux.
中的 execute_command_line
运行它。
这通常运行良好,但一段时间后我认为一定存在某种累积的内存泄漏,因为 GNUPlotting 变得越来越慢。在某些时候它几乎停滞不前。
因此我的问题是:是否可以在不终止 Fortran 主程序的情况下使用键盘中断对 execute_command_line
的调用?不用说,CTRL-C
杀死一切,这不是我想要的:我希望主程序继续。
我一直在玩可选标志 wait=.true.
但这没有帮助。
此外,我知道必须修复内存泄漏(或任何原因),但现在我想先看看诊断输出。
我能想出的唯一解决办法是一种解决方法:
修改 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
杀死 mpirun
,cannot be trapped 但您发送的是 SIGURS1
,它被正确地传播到可以直接处理的 mpi
进程。
然而,作为旁注,我意识到这不会解决我的问题,因为我的问题与使用 execute_command_line
对 gnuplot
的外部调用有关。由于我有一个累积内存泄漏,在某个时候这个调用开始永远占用,因为内存资源变得稀缺。所以我唯一能做的就是手动终止 gnuplot
进程。
当然,更好的是修复内存泄漏,我也这样做了。
我有一个 Fortran 程序,它对许多不同的输入数据运行一系列相同的计算。在完成这些计算之后,代码总是会编写一个 GNUplot 脚本来执行一些诊断绘图(没什么太难的)并使用 Linux.
中的execute_command_line
运行它。
这通常运行良好,但一段时间后我认为一定存在某种累积的内存泄漏,因为 GNUPlotting 变得越来越慢。在某些时候它几乎停滞不前。
因此我的问题是:是否可以在不终止 Fortran 主程序的情况下使用键盘中断对 execute_command_line
的调用?不用说,CTRL-C
杀死一切,这不是我想要的:我希望主程序继续。
我一直在玩可选标志 wait=.true.
但这没有帮助。
此外,我知道必须修复内存泄漏(或任何原因),但现在我想先看看诊断输出。
我能想出的唯一解决办法是一种解决方法:
修改 shell 脚本,使其
- 在后台运行 Fortran 程序:
./mpirun prog_name options &
- 获取此进程的 PID:
proc_PID=$!
- 等待进程:
wait $proc_PID
- 捕获一个中断信号:
trap handler SIGINT
- 让处理程序发送一个
SIGURS1
信号:function handler() { kill -SIGUSR1 $proc_PID }
- 在后台运行 Fortran 程序:
修改 Fortran 代码,使其捕获 SIGUSR1 信号并使用它执行您想要的操作。例如看看 here.
通过 运行 后台的 mpi
进程,您可以避免用 SIGINT
杀死 mpirun
,cannot be trapped 但您发送的是 SIGURS1
,它被正确地传播到可以直接处理的 mpi
进程。
然而,作为旁注,我意识到这不会解决我的问题,因为我的问题与使用 execute_command_line
对 gnuplot
的外部调用有关。由于我有一个累积内存泄漏,在某个时候这个调用开始永远占用,因为内存资源变得稀缺。所以我唯一能做的就是手动终止 gnuplot
进程。
当然,更好的是修复内存泄漏,我也这样做了。