Spec-Zone.ru › GNU Fortran 9

5.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=, Предыдущее: Потокобезопасность библиотеки времени выполнения, Вверх: Характеристики компилятора [Оглавление][Указатель]

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.3.0/gfortran/Data-consistency-and-durability.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API