Nejprve fsync()
(a sync()
) jsou standardní funkce POSIX, zatímco syncfs()
je pouze pro Linux.
Dostupnost je tedy jeden velký rozdíl.
Ze standardu POSIX pro fsync()
:
fsync()
funkce vyžádá že všechna data pro otevřený deskriptor souboru pojmenovanáfildes
se má přenést do úložného zařízení spojeného se souborem popsanýmfildes
. Povaha převodu je definována realizací.fsync()
funkce se nevrátí, dokud systém nedokončí tuto akci nebo dokud není zjištěna chyba.
Všimněte si, že je to jen žádost.
Ze standardu POSIX pro sync()
:
sync()
Tato funkce způsobí, že všechny informace v paměti, které aktualizují systémy souborů, budou naplánovány pro zápis do všech souborových systémů.Zápis, i když je naplánován, nemusí být nutně dokončen po návratu z
sync()
.
Opět platí, že to není zaručeno, že se to stane.
Manuálová stránka Linuxu pro syncfs()
(a sync()
) uvádí
sync()
způsobí, že všechny čekající úpravy metadat souborového systému a dat souborů uložených v mezipaměti budou zapsány do základních souborových systémů.
syncfs()
je jakosync()
, ale synchronizuje pouze soubor obsahující souborový systém, na který odkazuje otevřený deskriptor souborufd
.
Všimněte si, že kdy funkce vrací není specifikována.
Linux manuálová stránka pro fsync()
uvádí:
fsync()
přenese („vyprázdní“) všechna upravená vnitřní data (tj. upravené stránky mezipaměti pro) souboru, na který odkazuje deskriptor souborufd
na diskové zařízení (nebo jiné trvalé úložné zařízení), aby bylo možné načíst všechny změněné informace i v případě, že systém zkolabuje nebo se restartuje. To zahrnuje zápis nebo vyprázdnění mezipaměti adisk, pokud existuje. Hovor se zablokuje, dokud zařízení neoznámí, že byl přenos dokončen.Stejně jako vyprázdnění dat souboru
fsync()
také vyprázdní metadata přidružená k souboru (viz inode(7)).Volání
fsync()
nemusí nutně zajistit, že záznam v adresáři obsahující soubor také dosáhl na disk. K tomu explicitněfsync()
na deskriptoru souboru pro adresář je také potřeba.
Upozorňujeme, že záruky, které Linux poskytuje pro fsync()
jsou mnohem silnější než ty, které poskytuje sync()
nebo syncfs()
a podle POSIX pro oba fsync()
a sync()
.
Shrnuto:
- POSIX
fsync()
:"zapište prosím data pro tento soubor na disk" - POSIX
sync()
:„zapište všechna data na disk, až se k nim dostanete“ - Linux
sync()
:"zapsat všechna data na disk (až se k tomu dostanete?)" - Linux
syncfs()
:"zapsat všechna data pro souborový systém spojený s tímto souborem na disk (až se k tomu dostanete?)" - Linux
fsync()
:"zapište všechna data a metadata pro tento soubor na disk a nevracejte se, dokud to neuděláte"
Všimněte si, že manuálová stránka Linuxu neuvádí, kdy sync()
a syncfs()
vrátit.
Myslím, že současná odpověď není úplná. Pro Linux:
Podle standardní specifikace (např. POSIX.1-2001),
sync()
naplánuje zápisy, ale může se vrátit dříve, než bude samotný zápis dokončen. Linux však čeká na dokončení I/O, a tedysync()
nebosyncfs()
poskytují stejné záruky jakofsync
voláno na každý soubor v systému nebo souborovém systému.
a
Před verzí 1.3.20 Linux nečekal na dokončení I/O, než se vrátil.
Toto je zmíněno v sync(2)
stránku v sekcích „poznámky“ a „chyby“.