首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >写入fifo (命名管道)

写入fifo (命名管道)
EN

Stack Overflow用户
提问于 2012-08-02 23:11:50
回答 2查看 1.9K关注 0票数 8

我正在尝试让fortran 90应用程序打开fifo并向其中写入格式化数据。我已经将其简化为一个最小的示例。假设foo.f90为以下程序:

代码语言:javascript
复制
program foo
  open(1,file='fifo',position='asis',action='write')
  write(1,*)'Hello, world!'
  write(1,*)'Goodbye.'
end program

现在编译并运行程序:

代码语言:javascript
复制
$ gfortran-4.7.1 -o foo foo.f90
$ rm -f fifo
$ ./foo
$ cat fifo
 Hello, world!
$ rm -f fifo
$ mkfifo fifo
$ cat fifo > bar &
[1] 6115
$ strace -o foo.st ./foo
At line 3 of file foo.f90 (unit = 1, file = 'fifo')
Fortran runtime error: Invalid argument
[1]+  Done                    cat fifo > bar
$ tail foo.st
write(3, " Hello, world!\n", 15)        = 15
lseek(3, 0, SEEK_CUR)                   = -1 ESPIPE (Illegal seek)
ftruncate(3, 18446744073709551615)      = -1 EINVAL (Invalid argument)
write(2, "At line 3 of file foo.f90 (unit "..., 52) = 52
write(2, "Fortran runtime error: ", 23) = 23
write(2, "Invalid argument", 16)        = 16
write(2, "\n", 1)                       = 1
close(3)                                = 0
exit_group(2)                           = ?
+++ exited with 2 +++

因此,当写入普通文件时,该程序工作得足够好。但是,当写入fifo时,它会在第一次写入后尝试更改文件大小,并在失败后终止应用程序。

我对Fortran还很陌生,所以我不确定这是不是gfortran中的一个bug,或者有没有什么方法可以打开这个文件来抑制这个ftruncate系统调用。我更喜欢使用格式化的顺序方法:我的行有不同的长度,并且我宁愿避免为每个write指定一个记录号。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-08-03 00:42:39

这是一个old feature (甚至不敢认为它是一个bug!)在libgfortran中,以前已经打过补丁,但在GCC 4.7分支中重新引入,更具体地说,是在SVN revision 180701中。显然,gfortran开发人员不会使用命名管道测试他们的I/O代码。

您应该使用较早的Fortran版本(适用于4.6.1)或来自不同供应商的其他gfortran编译器。我会给GCC提交一份bug报告。

票数 4
EN

Stack Overflow用户

发布于 2018-10-01 07:57:41

使用gfortran 4.7.2-5我得到了同样的错误。

解决方案是修改OPEN语句,如下所示:

代码语言:javascript
复制
open(1,file='fifo',status='old',action='write',access='stream',form='formatted')

显式指定FORM='FORMATTED‘和ACTION='STREAM’。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11780556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档