【问题标题】:Write to fifo (named pipe)写入fifo(命名管道)
【发布时间】:2012-07-31 14:34:03
【问题描述】:

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

program foo
  open(1,file='fifo',position='asis',action='write')
  write(1,*)'Hello, world!'
  write(1,*)'Goodbye.'
end program

现在编译并运行程序:

$ 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 中的一个错误,或者是否有某种方法可以打开文件来抑制这个 ftruncate 系统调用。我宁愿坚持格式化顺序方法:我的行有不同的长度,我宁愿避免为每个 write 指定一个记录号。

【问题讨论】:

    标签: linux fortran named-pipes fortran90 gfortran


    【解决方案1】:

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

    您应该使用较旧的 gfortran 版本(适用于 4.6.1)或其他供应商提供的其他 Fortran 编译器。我将向 GCC 提交错误报告。

    【讨论】:

    • 使用gfortran-4.6.3 我得到了同样的行为。 gfortran-4.1.2Illegal seek 失败,即更早的一个系统调用。 gfortran-4.2.4 实际上似乎按预期工作,但不支持我实际应用程序中的代码。当您提交错误时,请告诉我它的 URL,以便我也可以订阅。
    • 它适用于gfortran 4.6.1。懒得实际检查 r180701 属于哪个标签,只是假设次要版本之间没有进行重大更改。
    • @MvG,我对旧错误发表了新评论。让我们看看会发生什么。
    【解决方案2】:

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

    解决办法是修改OPEN语句如下:

    open(1,file='fifo',status='old',action='write',access='stream',form='formatted')
    

    明确指定 FORM='FORMATTED' 和 ACTION='STREAM'。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-02
      • 2017-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2013-02-28
      相关资源
      最近更新 更多