Различие между сбросом и fsync

Я думал 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(). Какие-либо исходные данные?

50
задан JL2210 27 June 2019 в 07:45
поделиться

1 ответ

fflush () работает с FILE * , он просто сбрасывает внутренние буферы в FILE * вашего приложения в ОС.

fsync работает на более низком уровне, он сообщает ОС сбросить свои буферы на физический носитель.

Операционные системы сильно кэшируют данные, которые вы записываете в файл. Если бы ОС заставляла каждую запись попадать на диск, все было бы очень медленным. fsync (среди прочего) позволяет вам контролировать, когда данные должны попадать на диск.

Кроме того, fsync / commit работает с файловым дескриптором. Он не знает ФАЙЛ * и не может очистить свои буферы. ФАЙЛ * находится в вашем приложении, файловые дескрипторы обычно находятся в ядре ОС.

79
ответ дан 7 November 2019 в 10:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: