GNU/Linux >> Znalost Linux >  >> Linux

Jaký je rozdíl mezi fsync a syncfs?

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ým fildes . 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 jako sync() , ale synchronizuje pouze soubor obsahující souborový systém, na který odkazuje otevřený deskriptor souboru fd .

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 souboru fd 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:

  1. POSIX fsync() :"zapište prosím data pro tento soubor na disk"
  2. POSIX sync() :„zapište všechna data na disk, až se k nim dostanete“
  3. Linux sync() :"zapsat všechna data na disk (až se k tomu dostanete?)"
  4. Linux syncfs() :"zapsat všechna data pro souborový systém spojený s tímto souborem na disk (až se k tomu dostanete?)"
  5. 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 tedy sync() nebosyncfs() poskytují stejné záruky jako fsync 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“.


Linux
  1. Rozdíl mezi [[ $a ==Z* ]] a [ $a ==Z* ]?

  2. Rozdíl mezi symbolickými a pevnými odkazy?

  3. Jaký je rozdíl mezi strtok_r a strtok_s v C?

  1. Jaký je rozdíl mezi fsck a e2fsck?

  2. Jaký je rozdíl mezi adduser a useradd?

  3. Jaký je rozdíl mezi `fallocate --dig-holes` a `fallocate --punch-hole` v Linuxu?

  1. Jaký je rozdíl mezi $(CC) a $CC?

  2. Jaký je rozdíl mezi unlink a rm?

  3. Jaký je rozdíl mezi trasou a ip trasou?