Fortran 从命名管道读取(然后停止)
我正试图让两个fortran程序通过命名管道进行通信,但读取程序挂起。我的命令如下所示:Fortran 从命名管道读取(然后停止),fortran,fortran90,mkfifo,Fortran,Fortran90,Mkfifo,我正试图让两个fortran程序通过命名管道进行通信,但读取程序挂起。我的命令如下所示: > mkfifo /tmp/myfifo > ./app/fortw /tmp/myfifo & > ./app/fortr /tmp/myfifo 其中,fortw打印数字1到10,“fortr”的读取方式如下 open ( unit = nsave, file = outputfile , form = 'formatted', access = 'stream' ) do
> mkfifo /tmp/myfifo
> ./app/fortw /tmp/myfifo &
> ./app/fortr /tmp/myfifo
其中,fortw
打印数字1到10,“fortr”的读取方式如下
open ( unit = nsave, file = outputfile , form = 'formatted', access = 'stream' )
do while ( .TRUE. )
read ( unit = nsave, fmt = *, end = 10), j
write( 6, *), j
end do
10 continue
它打印数字1-6,然后挂起,因此我必须执行fg
然后C^C
来停止它
如果我用<代码> CAT<代码>或等效C++程序代替<代码> /APP/FRTR <代码>,那么我得到的数字是1到10,所以问题似乎是阅读而不是写作。但是如果我从普通文件而不是fifo读取,则
/app/fortr
会给出预期的结果
我是否应该期望能够让它发挥作用,而它是如何实现的
更新:
一个更简单的例子。如果测试包含数字1到10,则
./app/fortr test
打印数字1到10
但是
/app/fortr听起来你需要刷新。在write语句之后尝试刷新(6)。它不是标准的fortran。或者,如果在10之后结束程序,则在终止之前添加close(6)Flush
is standard Fortran。不幸的是,在读取程序中添加flush(6)和close(6)不会改变结果。读了6个数字后它仍然挂起你使用哪种编译器?什么代码提供读取操作的iostat?我使用的是gfortran。如果我在open命令中添加,action=“read”
,它现在似乎可以工作了。不过,我对fortran还不熟悉,所以我不知道这有什么帮助,也不知道它是否会继续工作。
./app/fortr <( cat test )