Я думал fsync()
делает fflush()
внутренне, таким образом с помощью fsync()
на потоке в порядке. Но я получаю неожиданный результат при казни под сетью I/O.
Мой фрагмент кода:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);
Но это кажется _commit()
не сбрасывает данные (я примерил Windows, и данные были записаны в экспортируемой файловой системе Linux).
Когда я изменил код, чтобы быть:
FILE* fp = fopen(file, "wb");
/* multiple fputs() calls like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);
это сбрасывает данные.
Я задаюсь вопросом если _commit()
делает то же самое как fflush()
. Какие-либо исходные данные?
fflush ()
работает с FILE *
, он просто сбрасывает внутренние буферы в FILE *
вашего приложения в ОС.
fsync
работает на более низком уровне, он сообщает ОС сбросить свои буферы на физический носитель.
Операционные системы сильно кэшируют данные, которые вы записываете в файл. Если бы ОС заставляла каждую запись попадать на диск, все было бы очень медленным. fsync
(среди прочего) позволяет вам контролировать, когда данные должны попадать на диск.
Кроме того, fsync / commit работает с файловым дескриптором. Он не знает ФАЙЛ *
и не может очистить свои буферы. ФАЙЛ *
находится в вашем приложении, файловые дескрипторы обычно находятся в ядре ОС.