fsync(2)

NAZWA
fsync, fdatasync - synchronizuje pełny, wewnątrzrdzeniowy stan pliku z zapisanym na dysku

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

    Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

fsync():
    glibc 2.16 i późniejsze:
        Nie jest konieczne definiowanie makr
    glibc do 2.15 włącznie:
        _BSD_SOURCE || _XOPEN_SOURCE
            || /* Od glibc 2.8: */ _POSIX_C_SOURCE >= 200112L

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

OPIS
fsync() przenosi („opróżnia”) wszystkie zmodyfikowane wewnątrzrdzeniowo dane (tj. zmodyfikowane strony bufora pamięci podręcznej) pliku, do którego odnosi się deskryptor pliku fd na dysk (lub inny trwały nośnik), dzięki czemu wszystkie zmienione informacje mogą być pozyskane nawet w przypadku załamania lub przeładowania systemu. Obejmuje to zapis bezpośredni i opróżnienie bufora dysku (jeśli istnieje). Wywołanie blokuje, do momentu gdy urządzenie poinformuje o zakończeniu transferu.

Oprócz opróżnienia plików danych, fsync() opróżnia również metadane związane z plikiem (zob. inode(7)).

Wywołanie fsync nie gwarantuje, że wpis w katalogu, zawierający informacje o pliku, również zostanie zapisany na dysku. Aby to osiągnąć, wymagane jest jawne wywołanie fsync na deskryptorze pliku dla katalogu.

fdatasync() jest podobne do fsync(), lecz nie opróżnia zmodyfikowanych metadanych, chyba że są one konieczne do kolejnego pomyślnego pobrania danych. Przykładowo, zmiana st_atime lub st_mtime (odpowiednio, czasu dostępu i czasu ostatniej modyfikacji; zob. inode(7)) nie wymaga opróżnienia, ponieważ nie jest to konieczne, aby następny odczyt danych został pomyślnie obsłużony. Z drugiej strony, zmiana rozmiaru pliku (st_size, dokonana na przykład przez ftruncate(2)), wymagałaby opróżnienia metadanych.

Celem fdatasync() jest redukcja aktywności dysku w przypadku aplikacji, które nie wymagają, aby wszystkie metadane były zsynchronizowane z tymi na dysku.

WARTOŚĆ ZWRACANA
W przypadku powodzenia, te wywołania zwracają zero. W razie wystąpienia błędu zwracane jest -1 i ustawiane jest errno wskazując błąd.

BŁĘDY

EBADF
    fd nie jest prawidłowym otwartym deskryptorem pliku.

EINTR
    Funkcja przerwana przez sygnał; zob. signal(7).

EIO Wystąpił błąd podczas synchronizacji. Błąd może odnosić się do zapisu danych dokonanych do innego deskryptora pliku tego samego pliku. Od Linuksa 4.13, błędy z bufora zapisu będą zgłaszane do wszystkich deskryptorów pliku, które mogły zapisywać dane wyzwalające błąd. Niektóre systemy plików (np. NFS) ściśle pilnują, która dane przeszły przez który deskryptor pliku, co daje dokładniej zgłaszane błędy. Inne systemy plików (np. większość lokalnych) zgłoszą błąd do wszystkich deskryptorów pliku, które były otwarte na pliku, w momencie odnotowania błędu.

ENOSPC
    Wyczerpano miejsce na dysku podczas synchronizacji.

EROFS
EINVAL
    fd jest powiązany ze specjalnym plikiem (np. potokiem, FIFO lub gniazdem), który nie obsługuje synchronizacji.

ENOSPC
EDQUOT
    fd jest skojarzony z plikiem na NFS lub na innym systemie plików, który nie przydziela miejsca w momencie wywołania systemowego write(2) i któryś z poprzednich zapisów nie powiódł się ze względu na brak miejsca na dysku.

WERSJE
W systemach POSIX, na których dostępny jest fdatasync(), _POSIX_SYNCHRONIZED_IO jest zdefiniowany w <unistd.h> na wartość większą od 0 (zob. też sysconf(3)).

STANDARDY
POSIX.1-2024.

HISTORIA

fsync()
    4.2BSD, SUSv1, POSIX.1-1996.

fdatasync()
    POSIX.1-1996.

W Linuksie 2.2 i wcześniejszych, fdatasync() jest równoważny fsync() i nie daje żadnych korzyści pod względem wydajności.

Implementacja fsync() na starszych jądrach i rzadziej używanych systemach plików nie potrafi opróżniać buforów dysku. W takich przypadkach konieczne jest wyłączenie buforów dysku za pomocą hdparm(8) lub sdparm(8), aby zagwarantować bezpieczne wykonanie.

W UNIX System V Wydanie 4 AT&T fd musi być otwarty do zapisu. Jest to samo w sobie niekompatybilne z oryginalnym interfejsem BSD i zabronione przez POSIX, ale mimo to przetrwało w HP-UX i AIX.

ZOBACZ TAKŻE
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)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 (https://www.gnu.org/licenses/gpl-3.0.html) lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej manpages-pl-list@lists.sourceforge.net.