Стандартная функция C fflush()
и системный вызов POSIX fsync()
концептуально несколько похожи. fflush()
работает с потоками файлов C (FILE
объекты) и поэтому является переносимым.
fsync()
работает с дескрипторами файлов POSIX.
И то, и другое приводит к отправке буферизованных данных в пункт назначения.
В системе POSIX каждый поток файлов C имеет соответствующий дескриптор файла , и все операции с потоком файлов C будут реализованы путем делегирования, при необходимости, системным вызовам POSIX, которые работают на дескриптор файла.
Можно подумать, что вызов fflush
в системе POSIX вызовет write
любых данных в буфере файлового потока, после чего вызовет fsync()
для файлового дескриптора этого файлового потока. , Таким образом, в системе POSIX не было бы необходимости следовать вызову fflush
и вызову fsync(fileno(fp))
. Но так ли это: звонит ли fsync
с fflush
?
Нет, вызов fflush
в системе POSIX не означает, что будет вызываться fsync
.
Стандарт C для fflush
говорит (выделено)
вызывает доставку любых неписанных данных для потока [] в среду хоста. для записи в файл
.
Утверждение, что данные должны быть записаны , а не записано означает, что дальнейшая буферизация средой хоста разрешена. Эта буферизация "средой хоста" может включать в себя для среды POSIX внутреннюю буферизацию, которая сбрасывается fsync
. Таким образом, внимательное прочтение стандарта C предполагает, что стандарт не требует реализации POSIX для вызова fsync
.
Стандартное описание POSIX fflush
не объявляет, как расширение семантики C , что fsync
вызывается.