Сбрасывание данных на диск

223
04 февраля 2018, 01:40

В какой момент происходит фактическая запись информации на диск?

Есть, к примеру следующий код:

std::ofstream file("somefile");
file << "Hello, world!\n";
std::flush(file);

Если сразу после выполнения строки std::flush(file) я вырубаю электричество, то каковы шансы при его включении увидеть в файле Hello, World!? Если шанс не 100%, то как его довести до желаемого гарантийного результата? Есть ли у ОС (Linux/Windows) какие-то способы убедиться, что информация на диск занеслась? Как такая ситуация обрабатывается в базах данных при транзакциях?

UPD: Запишется ли строка в файл, если программа упадет сразу после std::flush(file)?

Answer 1

За исключением случая, когда файл был открыт с флагом O_SYNC системного вызова open (почитать о всех его флагах будет, вероятно, в любом случае полезно), fflush() не обеспечивает желаемый вами функционал.
Эта функция перемещает данные из буфера, связанного с файлом в пространстве пользователя, в буферный кэш в пространстве ядра.

Для принудительной синхронизации с устройством при работе с FILE * после fflush надо выполнить системный вызов fsync (например, fflush(file), fsync(fileno(file));) , который синхронно запишет данные файла (и его метаинформацию) на устройство, обеспечивая также выталкивание кэша устройства, если он существует.

fsync() transfers ("flushes") all modified in-core data of (i.e., modified buffer cache pages for) the file referred to by the file descriptor fd to the disk device (or other permanent storage device) so that all changed information can be retrieved even after the system crashed or was rebooted. This includes writing through or flushing a disk cache if present. The call blocks until the device reports that the transfer has completed. It also flushes metadata information associated with the file (see stat(2)).

Однако, обратите внимание на следующий текст в руководстве (man-e)

Calling fsync() does not necessarily ensure that the entry in the directory containing the file has also reached disk. For that an explicit fsync() on a file descriptor for the directory is also needed.

что может создать проблемы для новых файлов.

READ ALSO
C++\Qt Получение доступа к компонентам

C++\Qt Получение доступа к компонентам

В программе есть компоненты, которые отвечают за определенный функционалКомпонент реализован при помощи MVC, (классы Model, Controller, View)

215
Как пути до исходников в Qt Creator

Как пути до исходников в Qt Creator

Есть динамическая библиотека собранная с отладочной информацией и исходники к нейПри отладке приложения которое использует эту библиотеку...

238
Перевод из textbox в int64 [требует правки]

Перевод из textbox в int64 [требует правки]

Ребят, помогите ,пожалуйста, преобразовать textbox в __int64Как правильно это сделать?

178
Как увеличить диапазон функции rand

Как увеличить диапазон функции rand

Всем приветПытаюсь сделать, чтобы выдавало большое случайное число

246