fsync(2) System Calls Manual fsync(2) NAZWA fsync, fdatasync - synchronizuje pelny, wewnatrzrdzeniowy stan pliku z zapisanym na dysku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int fsync(int fd); int fdatasync(int fd); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): fsync(): glibc 2.16 i pozniejsze: Nie jest konieczne definiowanie makr glibc do 2.15 wlacznie: _BSD_SOURCE || _XOPEN_SOURCE || /* Od glibc 2.8: */ _POSIX_C_SOURCE >= 200112L fdatasync(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >= 500 OPIS fsync() przenosi (,,oproznia") wszystkie zmodyfikowane wewnatrzrdzeniowo dane (tj. zmodyfikowane strony bufora pamieci podrecznej) pliku, do ktorego odnosi sie deskryptor pliku fd na dysk (lub inny trwaly nosnik), dzieki czemu wszystkie zmienione informacje moga byc pozyskane nawet w przypadku zalamania lub przeladowania systemu. Obejmuje to zapis bezposredni i oproznienie bufora dysku (jesli istnieje). Wywolanie blokuje, do momentu gdy urzadzenie poinformuje o zakonczeniu transferu. Oprocz oproznienia plikow danych, fsync() oproznia rowniez metadane zwiazane z plikiem (zob. inode(7)). Wywolanie fsync nie gwarantuje, ze wpis w katalogu, zawierajacy informacje o pliku, rowniez zostanie zapisany na dysku. Aby to osiagnac, wymagane jest jawne wywolanie fsync na deskryptorze pliku dla katalogu. fdatasync() jest podobne do fsync(), lecz nie oproznia zmodyfikowanych metadanych, chyba ze sa one konieczne do kolejnego pomyslnego pobrania danych. Przykladowo, zmiana st_atime lub st_mtime (odpowiednio, czasu dostepu i czasu ostatniej modyfikacji; zob. inode(7)) nie wymaga oproznienia, poniewaz nie jest to konieczne, aby nastepny odczyt danych zostal pomyslnie obsluzony. Z drugiej strony, zmiana rozmiaru pliku (st_size, dokonana na przyklad przez ftruncate(2)), wymagalaby oproznienia metadanych. Celem fdatasync() jest redukcja aktywnosci dysku w przypadku aplikacji, ktore nie wymagaja, aby wszystkie metadane byly zsynchronizowane z tymi na dysku. WARTOSC ZWRACANA W przypadku powodzenia, te wywolania zwracaja zero. W razie wystapienia bledu zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY EBADF fd nie jest prawidlowym otwartym deskryptorem pliku. EINTR Funkcja przerwana przez sygnal; zob. signal(7). EIO Wystapil blad podczas synchronizacji. Blad moze odnosic sie do zapisu danych dokonanych do innego deskryptora pliku tego samego pliku. Od Linuksa 4.13, bledy z bufora zapisu beda zglaszane do wszystkich deskryptorow pliku, ktore mogly zapisywac dane wyzwalajace blad. Niektore systemy plikow (np. NFS) scisle pilnuja, ktora dane przeszly przez ktory deskryptor pliku, co daje dokladniej zglaszane bledy. Inne systemy plikow (np. wiekszosc lokalnych) zglosza blad do wszystkich deskryptorow pliku, ktore byly otwarte na pliku, w momencie odnotowania bledu. ENOSPC Wyczerpano miejsce na dysku podczas synchronizacji. EROFS EINVAL fd jest powiazany ze specjalnym plikiem (np. potokiem, FIFO lub gniazdem), ktory nie obsluguje synchronizacji. ENOSPC EDQUOT fd jest skojarzony z plikiem na NFS lub na innym systemie plikow, ktory nie przydziela miejsca w momencie wywolania systemowego write(2) i ktorys z poprzednich zapisow nie powiodl sie ze wzgledu na brak miejsca na dysku. WERSJE W systemach POSIX, na ktorych dostepny jest fdatasync(), _POSIX_SYNCHRONIZED_IO jest zdefiniowany w na wartosc wieksza od 0 (zob. tez sysconf(3)). STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, 4.2BSD. W Linuksie 2.2 i wczesniejszych, fdatasync() jest rownowazny fsync() i nie daje zadnych korzysci pod wzgledem wydajnosci. Implementacja fsync() na starszych jadrach i rzadziej uzywanych systemach plikow nie potrafi oprozniac buforow dysku. W takich przypadkach konieczne jest wylaczenie buforow dysku za pomoca hdparm(8) lub sdparm(8), aby zagwarantowac bezpieczne wykonanie. W UNIX System V Wydanie 4 AT&T fd musi byc otwarty do zapisu. Jest to samo w sobie niekompatybilne z oryginalnym interfejsem BSD i zabronione przez POSIX, ale mimo to przetrwalo w HP-UX i AIX. ZOBACZ TAKZE 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) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.9.1 2 maja 2024 r. fsync(2)