В чем разница между fsync и syncfs?
В чем разница между fsync и syncfs?
int syncfs(int fd);
int fsync(int fd);
Страница man для fync сообщает следующее:
fsync () передает ("сбрасывает") все измененные данные в ядре (то есть, измененные страницы буферного кэша) файла, указанного дескриптором файла fd, на дисковое устройство (или другое устройство постоянного хранения), чтобы все измененную информацию можно получить даже после сбоя или перезагрузки системы. Это включает в себя запись или очистку дискового кэша, если таковой имеется. Вызов блокируется, пока устройство не сообщит, что передача завершена. Он также сбрасывает метаданные, связанные с файлом (см. Stat(2)).
Страница man для syncfs сообщает следующее:
sync () заставляет все буферизованные модификации метаданных файла и данных записываться в базовые файловые системы.
syncfs () похож на sync(), но синхронизирует только файловую систему, содержащую файл, указанный дескриптором открытого файла fd.
Для меня оба кажутся равными. Они синхронизируют файл, указанный дескриптором файла, и связанные метаданные.
1 ответ
Первый, fsync()
(а также sync()
) являются стандартными функциями POSIX, в то время как syncfs()
только для Linux
Так что доступность - это одна большая разница.
Из стандарта POSIX для fsync()
:
fsync()
Функция должна запросить все данные для дескриптора открытого файла, названногоfildes
должен быть передан на запоминающее устройство, связанное с файлом, описаннымfildes
, Характер передачи определяется реализацией.fsync()
функция не должна возвращаться, пока система не завершит это действие или пока не будет обнаружена ошибка.
Обратите внимание, что это просто запрос.
Из стандарта POSIX для sync()
:
sync()
Функция должна заставить всю информацию в памяти, которая обновляет файловые системы, планироваться для записи во все файловые системы.Письмо, хотя и запланировано, не обязательно завершено по возвращении из
sync()
,
Опять же, это не гарантировано.
Справочная страница по Linux для syncfs()
(а также sync()
) состояния
sync()
вызывает все ожидающие изменения метаданных файловой системы и данных кэшированного файла для записи в базовые файловые системы.
syncfs()
какsync()
, но синхронизирует только файловую систему, содержащую файл, указанный дескриптором открытого файлаfd
,
Обратите внимание, что когда функция возвращает не определено.
Справочная страница по Linux для fsync()
состояния:
fsync()
передает ("сбрасывает") все измененные данные в ядре (т. е. измененные страницы буферного кеша) файла, указанного дескриптором файлаfd
на дисковое устройство (или другое постоянное запоминающее устройство), чтобы можно было извлечь всю измененную информацию, даже если система выходит из строя или перезагружается. Это включает в себя запись или очистку дискового кэша, если таковой имеется. Вызов блокируется, пока устройство не сообщит, что передача завершена.Помимо очистки данных файла,
fsync()
также сбрасывает информацию метаданных, связанную с файлом (см. inode(7)).призвание
fsync()
не обязательно гарантирует, что запись в каталоге, содержащая файл, также достигла диска. За что явныйfsync()
на файловый дескриптор для каталога тоже нужно.
Обратите внимание, что Linux предоставляет гарантии fsync()
намного сильнее, чем те, которые предусмотрены для sync()
или же syncfs()
и POSIX для обоих fsync()
а также sync()
,
В итоге:
- POSIX
fsync()
: "пожалуйста, запишите данные для этого файла на диск" - POSIX
sync()
: "записать все данные на диск, когда вы обойдете его" - Linux
sync()
: "записать все данные на диск (когда вы обойдете его?)" - Linux
syncfs()
: "записать все данные для файловой системы, связанной с этим файлом, на диск (когда вы обойдете его?)" - Linux
fsync()
: "записать все данные и метаданные для этого файла на диск и не возвращаться, пока вы не сделаете"
Обратите внимание, что страница руководства Linux не указывает, когда sync()
а также syncfs()
вернуть.
Я думаю, что текущий ответ неполный. Для Linux:
Согласно стандартной спецификации (например, POSIX.1-2001),
sync()
планирует запись, но может вернуться до того, как фактическая запись будет выполнена. Однако Linux ждет завершения ввода-вывода и, следовательно,sync()
илиsyncfs()
предоставить те же гарантии, что иfsync
вызывается для каждого файла в системе или файловой системе соответственно.
а также
До версии 1.3.20 Linux не ждал завершения ввода-вывода перед возвратом.
Об этом говорится в sync(2)
страницу в разделах "примечания" и "ошибки".