Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran:管道到程序_Fortran_Fortran90_Gfortran - Fatal编程技术网

Fortran:管道到程序

Fortran:管道到程序,fortran,fortran90,gfortran,Fortran,Fortran90,Gfortran,是否有可能从Fortran启动一个外部程序,并将某些内容写入该程序的标准输入 例如,我知道gfortran的系统,但没有这样的选项。首先,如果您使用的是相对较新的编译器,您应该能够使用执行命令行(f2008规范的一部分),而不是系统(编译器扩展)。这将使用C库的system调用启动一个命令,该调用在nix上使用shshell,在Windows上使用cmd.exe(请参阅)。因此,您可以使用标准的输入重定向类型方法连接到已启动程序的stdin,但它可能不适合更复杂的使用 下面的示例显示了一个简单的

是否有可能从Fortran启动一个外部程序,并将某些内容写入该程序的标准输入


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

首先,如果您使用的是相对较新的编译器,您应该能够使用
执行命令行(f2008规范的一部分),而不是
系统
(编译器扩展)。这将使用
C
库的
system
调用启动一个命令,该调用在nix上使用
sh
shell,在Windows上使用
cmd.exe
(请参阅)。因此,您可以使用标准的输入重定向类型方法连接到已启动程序的
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
程序标准
隐式无
字符(len=20)::cmd,args
字符(len=50)::fullcmd
cmd=“bc”
args=“1+2”

fullcmd=cmd/“正如您所注意到的,GFortran没有内置类似pipe()/fork()/exec()的函数

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

  • 执行命令行(“mkfifo/path/to/fifo”)
  • mkfifo命令创建一个命名管道,即在文件系统中也有名称的管道

  • 打开(newunit=plot\u unit,file=“/path/to/fifo”,access=“stream”,format=“formatted”)

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


    如果出现这种死锁,您可能需要交换#2和#3的顺序。但是上面的一些小的变化应该会起作用(我用它连接了一个Fortran程序和另一个Fortran程序)。

    谢谢!但是这样我必须先构造字符串,这似乎不切实际,因为我有相当大的数据量(我希望将结果通过管道传输到gnuplot,而无需编写数据文件,因为这会大大降低速度)。根据数据的大小,如果您以编程方式从数据构造字符串,这仍然是可能的,尽管它可能不是非常有效/合理。您可能希望创建一个ramdisk,然后将数据从fortran写入此区域。这应该很快,并且允许您只需调用
    gnuplot
    ramdisk是个好主意……但是我切换到Python进行绘图,因为在那里我可以使用f2py,然后从Python调用Fortran代码。Python比gnuplot更通用。
     Running bc                   <<< 1+2
     3