Учитывая две функции, которые очищают буферы:
fflush()
sync()
Как я могу узнать, когда требуется вызов любого из них?
Я знаю, что добавление '\n'
к printf()
очистит выходной буфер, но если строка не содержит такого символа, когда я могу пропустить этот вызов, а когда нет (многопоточные системы?)?
То же самое касается 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.
Дополнительный вопрос:
В первом комментарии к этому ответу показан способ отключения буферизации stdout
с помощью setbuf(stdout, NULL);
. Есть ли что-то подобное для sync
(какой буфер для этого используется?)?