Запись в fifo (именованный канал)

Я пытаюсь заставить приложение 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.

8
задан MvG 2 August 2012 в 17:06
поделиться