4.6 Согласованность и долговечность данных
В этом разделе кратко рассматриваются вопросы согласованности и долговечности данных и метаданных при выполнении операций ввода-вывода.
Что касается долговечности, GNU Fortran не предпринимает никаких усилий для обеспечения того, чтобы данные были сохранены в стабильном хранилище. Если это требуется, программист GNU Fortran может использовать встроенную функцию FNUM для получения дескриптора файла низкого уровня, соответствующего открытому Fortran-блоку. Затем, используя, например, функцию ISO_C_BINDING, можно вызвать системный вызов для записи изменённых данных в стабильное хранилище, например, fsync в POSIX, _commit в MingW или fcntl(fd,
F_FULLSYNC, 0) в Mac OS X. Следующий пример демонстрирует вызов fsync:
! Declare the interface for POSIX fsync function
interface
function fsync (fd) bind(c,name="fsync")
use iso_c_binding, only: c_int
integer(c_int), value :: fd
integer(c_int) :: fsync
end function fsync
end interface
! Variable declaration
integer :: ret
! Opening unit 10
open (10,file="foo")
! ...
! Perform I/O on unit 10
! ...
! Flush and sync
flush(10)
ret = fsync(fnum(10))
! Handle possible error
if (ret /= 0) stop "Error calling FSYNC"
Что касается согласованности, для обычных файлов GNU Fortran использует буферизованный ввод-вывод для повышения производительности. Этот буфер очищается автоматически при заполнении и в некоторых других ситуациях, например, при закрытии блока. Его также можно явно очистить с помощью инструкции FLUSH. Кроме того, буферизацию можно отключить с помощью переменных среды GFORTRAN_UNBUFFERED_ALL и GFORTRAN_UNBUFFERED_PRECONNECTED. Специальные файлы, такие как терминалы и каналы, всегда небуферизованные. Однако иногда может потребоваться выполнить дополнительные действия для того, чтобы другие процессы могли видеть данные, записанные GNU Fortran, как показано ниже.
Платформа Windows поддерживает модель согласованности метаданных с ослабленным режимом, где метаданные файла записываются в каталог лениво. Это означает, что, например, команда dir может отображать устаревшее значение размера файла. Для принудительного обновления метаданных каталога можно закрыть блок или вызвать _commit для дескриптора файла. Однако обратите внимание, что _commit принудительно запишет все изменённые данные в стабильное хранилище, что часто является очень медленной операцией.
Система файловой системы сети (NFS) реализует модель согласованности с ослабленным режимом, называемую согласованностью «открытие-закрытие». Закрытие файла принудительно записывает изменённые данные и метаданные на сервер, а открытие файла принуждает клиента связаться с сервером для повторной проверки кэшированных данных. fsync также заставит сбросить изменённые данные и метаданные на сервер. Аналогично open и close, получение и освобождение fcntl блокировок файлов (если сервер их поддерживает) также заставит проверить кэш и сбросить изменённые данные и метаданные.
Далее: Файлы, открытые без явного указания ACTION= specifier, Предыдущее: Потокобезопасность библиотеки времени выполнения, Вверх: Характеристики компилятора [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/gfortran/Data-consistency-and-durability.html