В чем разница между 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(),

В итоге:

  1. POSIX fsync(): "пожалуйста, запишите данные для этого файла на диск"
  2. POSIX sync(): "записать все данные на диск, когда вы обойдете его"
  3. Linux sync(): "записать все данные на диск (когда вы обойдете его?)"
  4. Linux syncfs(): "записать все данные для файловой системы, связанной с этим файлом, на диск (когда вы обойдете его?)"
  5. Linux fsync(): "записать все данные и метаданные для этого файла на диск и не возвращаться, пока вы не сделаете"

Обратите внимание, что страница руководства Linux не указывает, когда sync() а также syncfs() вернуть.

Я думаю, что текущий ответ неполный. Для Linux:

Согласно стандартной спецификации (например, POSIX.1-2001), sync() планирует запись, но может вернуться до того, как фактическая запись будет выполнена. Однако Linux ждет завершения ввода-вывода и, следовательно,sync() или syncfs() предоставить те же гарантии, что и fsync вызывается для каждого файла в системе или файловой системе соответственно.

а также

До версии 1.3.20 Linux не ждал завершения ввода-вывода перед возвратом.

Об этом говорится в sync(2)страницу в разделах "примечания" и "ошибки".

Другие вопросы по тегам