gpt4 book ai didi

linux - 写入 fifo(命名管道)

转载 作者:IT王子 更新时间:2023-10-29 00:21:41 28 4
gpt4 key购买 nike

我正在尝试让 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 时都必须指定一个记录号。

最佳答案

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

您应该使用较旧的 gfortran 版本(适用于 4.6.1)或来自不同供应商的另一个 Fortran 编译器。我将向 GCC 提交错误报告。

关于linux - 写入 fifo(命名管道),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11780556/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com