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 的系统,您可以执行类似
的操作
- execute_command_line("mkfifo /path/to/fifo")
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 程序连接到另一个程序)。
是否有可能从 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 的系统,您可以执行类似
的操作- execute_command_line("mkfifo /path/to/fifo")
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 程序连接到另一个程序)。