fsync(2)

НАИМЕНОВАНИЕ
fsync, fdatasync - синхронизирует состояние файла в памяти с состоянием на устройстве хранения

БИБЛИОТЕКА
Стандартная библиотека языка C (libc, -lc)

ОБЗОР
#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

    Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

fsync():
    glibc 2.16 and later:
        No feature test macros need be defined
    glibc up to and including 2.15:
        _BSD_SOURCE || _XOPEN_SOURCE
            || /* Since glibc 2.8: */ _POSIX_C_SOURCE >= 200112L

fdatasync():
    _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500

ОПИСАНИЕ
Вызов fsync() пересылает («сбрасывает») все изменённые в памяти (in-core) данные (т. е., изменённые страницы буферного кэша) файла, на который указывает файловый дескриптор fd, на дисковое устройство (или другое устройство постоянного хранения) таким образом, что вся изменённая информация может быть получена даже после падения системы или внезапной перезагрузки. При этом выполняется непосредственная запись или сброс дискового кэша (если он есть). Вызов блокируется до тех пор, пока устройство не сообщит, что пересылка завершена.

Помимо сброса самих данных, также сбрасывается информация о метаданных, связанная с файлом (смотрите inode(7)).

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

Вызов fdatasync() подобен fsync(), но не записывает изменившиеся метаданные, если эти метаданные не нужны для последующего получения данных. Например, изменения st_atime или st_mtime (время последнего доступа и последнего изменения, соответственно; смотрите inode(7)) не нужно записывать, так как они ненужны для чтения самих данных. С другой стороны, при изменении размера файла (st_size, изменяется, например, ftruncate(2)) запись метаданных будет нужна.

Целью создания fdatasync() является сокращение обменов с диском для приложений, которым не нужна синхронизация метаданных с диском.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, these system calls return zero. On error, -1 is returned, and errno is set to indicate the error.

ОШИБКИ

EBADF
    Значение fd не является правильным открытым файловым дескриптором.

EINTR
    The function was interrupted by a signal; see signal(7).

EIO Во время синхронизации произошла ошибка. Эта ошибка может относится к данным, записанным в какой-то другой файловый дескриптор того же файла. Начиная с Linux 4.13, об ошибках отложенной записи (write-back) будет сообщено всем файловым дескрипторам, которые могли записывать данные при возникновении ошибки. Некоторые файловые системы (например, NFS) следят за тем какие данные поступили из файлового дескриптора и сообщают только там, где нужно. Другие файловые системы (например, большинство локальных файловых систем) сообщат об ошибках всем файловым дескрипторам, которые уже открыли файл при возникновении ошибки.

ENOSPC
    При синхронизации закончилось дисковое пространство.

EROFS
EINVAL
    Значение fd связано со специальным файлом (например, канал, FIFO или сокет), который не поддерживает синхронизацию.

ENOSPC
EDQUOT
    Значение fd указывает на файл в NFS или другой файловой системе, которая не выделяет место во время системного вызова write(2), и какая-то предыдущая операция записи завершилась ошибкой из-за нехватки места.

ВЕРСИИ
В системах POSIX, в которых есть fdatasync(), в <unistd.h> определено значение для _POSIX_SYNCHRONIZED_IO и оно больше 0 (см. также sysconf(3)).

СТАНДАРТЫ
POSIX.1-2024.

ИСТОРИЯ
POSIX.1-2001, 4.2BSD.

В Linux 2.2 и ранее, вызов fdatasync() эквивалентен fsync(), и поэтому не даёт преимуществ в производительности.

Реализации fsync() в старых ядрах и ранее, использовавшиеся в файловых системах, не знают как очищать (flush) дисковые кэши. В этих случаях дисковые кэши требуется заблокировать с помощью hdparm(8) или sdparm(8), чтобы гарантировать безопасное выполнение.

Under AT&T UNIX System V Release 4 fd needs to be opened for writing. This is by itself incompatible with the original BSD interface and forbidden by POSIX, but nevertheless survives in HP-UX and AIX.

СМОТРИТЕ ТАКЖЕ
sync(1), bdflush(2), open(2), posix_fadvise(2), pwritev(2), sync(2), sync_file_range(2), fflush(3), fileno(3), hdparm(8), mount(8)

ПЕРЕВОД
Русский перевод этой страницы руководства разработал(и) Azamat Hackimov <azamat.hackimov@gmail.com>, Dmitry Bolkhovskikh <d20052005@yandex.ru>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com>

Этот перевод является свободной программной документацией; он распространяется на условиях общедоступной лицензии GNU (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков (<debian-l10n-russian@lists.debian.org>).