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.
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
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. –
@MvG, habe ich einen neuen Kommentar zu dem alten Fehler gemacht. Mal sehen was passiert. –