是否有可能从Fortran启动外部程序并向此程序标准输入写入内容?
我知道,例如gfortran的系统,但没有这样的选择。
答案 0 :(得分:3)
正如您所注意到的,GFortran没有像内置的pipe()/ fork()/ exec()函数那样的东西。
如果您使用的是Linux或其他类似Unix的系统,则可以执行类似
的操作mkfifo命令创建一个命名管道,即在文件系统中也有名称的管道。
open(newunit = plot_unit,file =“/ path / to / fifo”,access =“stream”,format =“formatted”)
execute_command_line(“gnuplot< / path / to / fifo”)
因此,您可以在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