сбрасывать без синхронизации - PullRequest
3 голосов
/ 18 сентября 2011

Из того, что я прочитал, flush помещает данные в буферы ОС и синхронизирует их с загрузкой на носитель. Итак, если вы хотите быть уверены, что данные на самом деле записаны на диск, вам нужно выполнить очистку с последующей синхронизацией. Итак, есть ли случаи, когда вы хотите вызвать сброс, но не синхронизировать?

Ответы [ 4 ]

3 голосов
/ 18 сентября 2011

Вы хотите fflush, только если вы используете stdio's FILE *.Это записывает буфер пространства пользователя в ядро.

Другие ответы, похоже, отсутствуют fdatasync.Это системный вызов, который вы хотите записать на дескриптор определенного файла.

1 голос
/ 18 сентября 2011

Когда вы fflush, вы сбрасываете буфер одного файла на диск (если только вы не зададите NULL, в этом случае он сбрасывает все открытые файлы).http://www.manpagez.com/man/3/fflush/

Когда вы sync, вы сбрасываете все буферы на диск.http://www.manpagez.com/man/2/sync/

Самое важное, на что следует обратить внимание, это то, что fflush - это стандартная функция, а sync - системный вызов, предоставляемый операционной системой (например, Linux).

То есть, если вы пишете переносимую программу, вы фактически никогда не используете sync.

0 голосов
/ 18 сентября 2011

Просто для пояснения, fflush() применяется только при использовании интерфейса FILE UNIX, который буферизует записи на уровне приложения. Если используется обычный вызов write(), fflush() не имеет смысла.

Сказав это, я могу вспомнить две ситуации, когда вы хотели бы вызвать fflush(), но не синхронизировать:

  1. Вы хотите убедиться, что данные в конечном итоге попадут на диск, даже если приложение выйдет из строя.
  2. Принудительно отображать данные, которые приложение уже записало в стандартный вывод.

Второй случай - это наиболее распространенное использование, которое я видел, и оно обычно требуется, если вызов printf() не заканчивается символом новой строки ('\ n').

0 голосов
/ 18 сентября 2011

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

Обратите внимание, что очистка - это операция более высокого уровня, чем read() или аналогичные системные вызовы. Он используется библиотекой C <stdio.h> или библиотекой C ++ <iostream>. Системные вызовы по своей природе сбрасывают данные в буферный пул ядра (или напрямую на диск, если вы используете прямой ввод-вывод или что-то подобное).

Также обратите внимание, что в POSIX-подобных системах вы можете организовать синхронизацию данных и т. Д., Установив флаги для системного вызова open() (O_SYNC, O_DSYNC, O_RSYNC) или впоследствии через fcntl().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...