Fortran:管道编程

时间:2016-06-11 12:38:54

标签: fortran fortran90 gfortran

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

我知道,例如gfortran的系统,但没有这样的选择。

2 个答案:

答案 0 :(得分:3)

正如您所注意到的,GFortran没有像内置的pipe()/ fork()/ exec()函数那样的东西。

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

的操作
  1. execute_command_line(“mkfifo / path / to / fifo”)
  2. mkfifo命令创建一个命名管道,即在文件系统中也有名称的管道。

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

    2. execute_command_line(“gnuplot< / path / to / fifo”)

    3. 因此,您可以在GFortran中像普通外部设备一样打开FIFO,然后使用连接到FIFO的标准输入执行gnuplot。

      如果发生此死锁,您可能需要更换#2和#3的顺序。但是上面的一些小变化应该可行(我用它来连接另一个Fortran程序)。

答案 1 :(得分:2)

首先,如果您使用的是相对较新的编译器,则应该能够使用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