Fortran:管道到程序

Fortran: pipe to program

是否有可能从 Fortran 启动外部程序并向该程序标准输入写入内容?

我知道,例如gfortran 的 SYSTEM 但没有这样的选项。

首先,如果您使用的是相对较新的编译器,您应该能够使用 execute_command_line(f2008 规范的一部分)而不是 system(编译器扩展)。这将使用 C 库的 system 调用启动命令,该调用在 nix 上使用 sh shell 并在 Windows 上使用 cmd.exe(参见 here).因此,您可以使用标准输入重定向类型方法连接到已启动程序的 stdin,但它可能不适合更复杂的用途。

下面的例子展示了一个简单的例子

program stdIn
  implicit none
  character(len=20) :: cmd, args
  character(len=50) :: fullcmd
  cmd = "bc"
  args = "1+2"
  fullcmd = cmd//" <<< "//args
  print*,"Running ",fullcmd
  call execute_command_line(fullcmd)
end program stdIn

哪个应该输出

 Running bc                   <<< 1+2
 3

正如您所注意到的,GFortran 没有任何内置的 pipe()/fork()/exec() 函数。

如果您使用的是 Linux 或其他类似 Unix 的系统,您可以执行类似

的操作
  1. execute_command_line("mkfifo /path/to/fifo")

mkfifo 命令创建一个命名管道,即在文件系统中也有一个名称的管道。

  1. open(newunit=plot_unit, file="/path/to/fifo", access="stream", format="formatted")

  2. execute_command_line("gnuplot < /path/to/fifo")

所以我们的想法是,您可以像打开 GFortran 中的普通外部单元一样打开 FIFO,然后使用连接到 FIFO 的标准输入执行 gnuplot。

您可能需要调换#2 和#3 的顺序以防出现死锁。但是上面的一些小变化应该可以工作(我用它从一个 Fortran 程序连接到另一个程序)。