Главная » 2017 » Ноябрь » 19 » man 2 fsync
22:11
man 2 fsync

SEO sprint - Всё для максимальной раскрутки!





ИМЯ


fsync, fdatasync - синхронизирует состояние файла в памяти с состоянием на
устройстве хранения



ОБЗОР


#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

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

fsync():
в glibc 2.16 и новее:
Не требуется определять макросы тестирования свойств
до glibc 2.15 включительно:
_BSD_SOURCE || _XOPEN_SOURCE
|| /* начиная с 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() является сокращение обменов с диском для приложений,
которым не нужна синхронизация метаданных с диском.



ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ


В случае успеха данные системные вызовы возвращают ноль. Если произошла ошибка
возвращается -1 и errno устанавливается должным образом.



ОШИБКИ


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

EIO Во время синхронизации произошла ошибка. Эта ошибка может относится к
данным, записанным в какой-то другой файловый дескриптор того же файла.

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

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



СООТВЕТСТВИЕ СТАНДАРТАМ


POSIX.1-2001, POSIX.1-2008, 4.3BSD.



ДОСТУПНОСТЬ


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



ЗАМЕЧАНИЯ


В некоторых системах UNIX (но не в Linux), fd должен быть файловым дескриптором,
доступным для записи.

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

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



СМОТРИТЕ ТАКЖЕ


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)



Категория: (2) Системные вызовы ядра (функции языка Си) | Просмотров: 611 | Добавил: Администратор | Рейтинг: 0.0/0
Всего комментариев: 0
avatar