Учитывая две функции, которые очищают буферы:
fflush()
sync()
Как я могу узнать, когда нужен звонок одному из них?
Я знаю, что добавление '\n'
к printf()
очистит буфер вывода, но если строка не содержит такого символа, когда я могу пропустить этот вызов, а когда нет (multiмногопоточные системы?)?
То же самое относится и к sync
.У меня есть функция, которая сохраняет файлы в файловой системе (сохранение выполняется через серию системных вызовов), и кажется, что без вызова sync
файлы не сохраняются в определенном случае
К сожалению, в настоящее время у меня нет всех подробностей по этому делу [. Что я знаю, так это то, что файлы сохраняются, и сразу после этого происходит отключение питания (не знаю точно, как скоро), ифайлов нет после перезагрузки ].Во всех тестах, которые я запускаю, файлы были сохранены правильно.
Итак, как я могу выяснить, когда система очистит буферы данных / метаданных файла, а когда - нет, и мне нужно явно вызватьsync()
?
Цитирующий man (который не указывает, когда необходим явный вызов) :
sync, syncfs - commit buffer cache to disk
sync() causes all buffered modifications to file metadata and data to be written to the underlying file systems.
fflush - flush a stream
For output streams, fflush() forces a write of all user-space buffered data for the given output or update stream via the stream's underlying write function. For input streams, fflush() discards any buffered data that has been fetched from the underlying file, but has not been consumed by the application. The open status of the stream is unaffected.
Дополнительный вопрос:
1-й комментарий к этому ответу показывает способ отключения буферизации stdout
с помощью setbuf(stdout, NULL);
.Есть ли что-то вроде sync
(какой буфер используется для этого?)?