Блокирует ли fwrite до тех пор, пока данные не будут записаны на диск? - PullRequest
0 голосов
/ 23 июня 2018

Возвращается ли функция fwrite() после того, как данные, которые должны быть записаны на диск, переданы операционной системе, или она возвращается только после того, как данные фактически физически записаны на диск?

Для моегоЯ надеюсь, что это первый случай, так как я не хочу ждать, пока все данные физически будут записаны на диск.Я надеюсь, что другой поток ОС передает его в фоновом режиме.

Мне интересно поведение в Windows 10 в данном конкретном случае.

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fwrite

Ответы [ 2 ]

0 голосов
/ 23 июня 2018

Возвращает ли функция fwrite(fp, ... ) после того, как данные для записи на диск были переданы операционной системе, или она возвращается только после того, как данные фактически физически записаны на диск?

Нет.На самом деле, он даже не (обязательно) ждет, пока данные будут переданы в ОС - fwrite может просто поместить данные в свой внутренний буфер и сразу же вернуться без какой-либо записи.

Принудительно заставить данныеОС, вам нужно использовать fflush(fp) для указателя FILE, но это все равно не обязательно записывает данные на диск, хотя обычно оно ставит их в очередь для записи.Но он не ждет окончания этих записей в очереди.

Таким образом, чтобы гарантировать запись данных на диск, необходимо выполнить вызов уровня ОС, чтобы дождаться завершения записи в очередь.В системах POSIX (таких как Linux) это fsync(fileno(fp)).Вам нужно изучить документацию по Windows, чтобы понять, как сделать аналог в Windows.

0 голосов
/ 23 июня 2018

Существует несколько мест, где существует буферизация данных для повышения эффективности при использовании fwrite(): буферизация в среде выполнения C ++ и буферизация в интерфейсе файловой системы операционной системы и буферизация в реальном оборудовании диска.

По умолчанию они задерживают фактическую физическую запись данных на диск до тех пор, пока не появится фактический запрос на очистку буферов или не будут включены соответствующие индикаторы для выполнения физической записи при выполнении запросов на запись.

Если вы хотите изменить поведение fwrite(), взгляните на setbuf() функцию перенаправление setbuf , а также setbuff() справочную страницу Linux и вот Документация Microsoft по setbuf().

И если вы посмотрите на документацию по базовой Windows CreateFile() функции , вы увидите, что есть несколько флагов, которые включают флаги какнужно ли делать буферизацию данных.

FILE_FLAG_NO_BUFFERING 0x20000000

Файл или устройство открываются без системного кэширования для чтения и записи данных.Этот флаг не влияет на кэширование жесткого диска или файлы, отображаемые в память.

Существуют строгие требования для успешной работы с файлами, открытыми с помощью CreateFile с использованием флага FILE_FLAG_NO_BUFFERING, подробности см. В разделе Буферизация файлов.

И посмотрите раздел документации Microsoft. Буферизация файлов .

В простом примере приложение откроет файл для доступа на запись с флагом FILE_FLAG_NO_BUFFERING, а затем выполнит вызов.к функции WriteFile, используя буфер данных, определенный в приложении.В этих обстоятельствах этот локальный буфер является фактически единственным файловым буфером, который существует для этой операции.Из-за структуры физического диска, структуры хранилища файловой системы и отслеживания положения указателя файла на уровне системы эта операция записи завершится ошибкой, если локально определенные буферы данных не соответствуют определенным критериям выравнивания, обсуждаемым в следующем разделе.

Посмотрите на это обсуждение настроек на уровне ОС для того, что выглядит как Linux https://superuser.com/questions/479379/how-long-can-file-system-writes-be-cached-with-ext4

...