2012-08-02 7 views
8

Ich versuche eine Fortran 90-Anwendung zu bekommen, um einen Fifo zu öffnen und formatierte Daten darauf zu schreiben. Ich habe das auf ein minimales Beispiel reduziert. Lassen Sie foo.f90 das folgende Programm:Schreiben an fifo (Named Pipe)

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

Jetzt kompilieren und das Programm ausführen:

$ 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 +++ 

Also das Programm gut genug funktioniert, wenn auf eine normale Datei zu schreiben. Beim Schreiben in den FIFO wird jedoch versucht, die Dateigröße nach dem ersten Schreibvorgang zu ändern und die Anwendung zu beenden, nachdem dies fehlgeschlagen ist.

Ich bin ziemlich neu in Fortran, also bin ich mir nicht sicher, ob das ein Fehler in Gfortran ist, oder ob es eine Möglichkeit gibt, die Datei zu öffnen, die diesen ftruncate Syscall unterdrückt. Ich würde es vorziehen, mit dem formatierten sequentiellen Ansatz zu bleiben: Meine Zeilen haben unterschiedliche Längen, und ich würde lieber vermeiden, eine Datensatznummer mit jedem write angeben zu müssen.

Antwort

4

Dies ist ein old feature (wagen es nicht einmal ein Fehler, es ist zu denken!) In libgfortran, die Versionen vor gepatcht wurde, sondern für den GCC 4.7 Zweig, genauer gesagt in SVN revision 180701 wieder eingeführt. Anscheinend gfortran Entwickler testen ihren E/A-Code nicht mit Named Pipes.

Sie sollten eine ältere Version gfortran (funktioniert mit 4.6.1) oder einen anderen Fortran-Compiler eines anderen Herstellers verwenden. Ich werde einen Fehlerbericht an GCC senden.

+1

Mit 'gfortran-4.6.3' bekomme ich das gleiche Verhalten. "gfortran-4.1.2" schlägt mit "illegaler Suche" fehl, d. h. ein Syscall früher. 'gfortran-4.2.4' scheint tatsächlich wie vorgesehen zu funktionieren, unterstützt aber den Code in meiner eigentlichen Anwendung nicht. Wenn Sie einen Fehler senden, lassen Sie mich seine URL wissen, damit ich auch abonnieren kann. – MvG

+1

Es funktioniert mit 'gfortran' 4.6.1. War zu faul, um tatsächlich zu überprüfen, zu welchem ​​Tag r180701 gehört und nahm nur an, dass keine wesentlichen Änderungen zwischen Nebenversionen vorgenommen werden. –

+0

@MvG, habe ich einen neuen Kommentar zu dem alten Fehler gemacht. Mal sehen was passiert. –