8
我試圖得到一個Fortran 90的應用程序打開一個FIFO和格式化的數據寫入。我已經把它解釋爲一個最小的例子。讓foo.f90
是下面的程序:寫入FIFO(命名管道)
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
的記錄編號。
使用'gfortran-4.6.3'我獲得相同的行爲。 'gfortran-4.1.2'由於'非法查找'失敗,即一個系統調用較早。 'gfortran-4.2.4'實際上似乎按預期工作,但不會在我的實際應用程序中支持代碼。當您提交錯誤時,請讓我知道它的URL,以便我可以訂閱。 – MvG 2012-08-02 16:50:19
它適用於'gfortran' 4.6.1。懶得實際檢查哪個標籤r180701屬於,只是假定在次要版本之間沒有進行重大更改。 – 2012-08-02 16:53:39
@MvG,我對老bug做了一個新的評論。讓我們看看會發生什麼。 – 2012-08-02 17:41:37