2012-08-02 289 views
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的記錄編號。

回答

4

這是一個old feature(人甚至不敢認爲這是一個錯誤!),這是以前版本的補丁,但在SVN revision 180701被再海合會4.7分支,更具體地說是在libgfortran。顯然,gfortran開發人員不會使用命名管道來測試他們的I/O代碼。

你應該使用較舊版本gfortran(4.6.1工程)或其他Fortran編譯來自不同的供應商。我會向GCC提交一個錯誤報告。

+1

使用'gfortran-4.6.3'我獲得相同的行爲。 'gfortran-4.1.2'由於'非法查找'失敗,即一個系統調用較早。 'gfortran-4.2.4'實際上似乎按預期工作,但不會在我的實際應用程序中支持代碼。當您提交錯誤時,請讓我知道它的URL,以便我可以訂閱。 – MvG 2012-08-02 16:50:19

+1

它適用於'gfortran' 4.6.1。懶得實際檢查哪個標籤r180701屬於,只是假定在次要版本之間沒有進行重大更改。 – 2012-08-02 16:53:39

+0

@MvG,我對老bug做了一個新的評論。讓我們看看會發生什麼。 – 2012-08-02 17:41:37

相關問題