GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist der Unterschied zwischen fsync und syncfs?

Zuerst fsync() (und sync() ) sind POSIX-Standardfunktionen, während syncfs() ist nur Linux.

Die Verfügbarkeit ist also ein großer Unterschied.

Aus dem POSIX-Standard für fsync() :

Die fsync() Funktion soll anfordern dass alle Daten für den offenen Dateideskriptor mit dem Namen fildes soll auf das Speichergerät übertragen werden, das der durch fildes beschriebenen Datei zugeordnet ist . Die Art der Übertragung ist implementierungsdefiniert. Die fsync() Die Funktion darf nicht zurückkehren, bis das System diese Aktion abgeschlossen hat oder bis ein Fehler erkannt wird.

Beachten Sie, dass es nur eine Anfrage ist.

Aus dem POSIX-Standard für sync() :

Die sync() Funktion soll bewirken, dass alle Informationen im Speicher, die Dateisysteme aktualisieren, zum Schreiben eingeplant werden an alle Dateisysteme aus.

Das Schreiben ist, obwohl geplant, nicht notwendigerweise nach der Rückkehr von sync() abgeschlossen .

Auch das ist nicht garantiert.

Die Linux-Manpage für syncfs() (und sync() ) Zustände

sync() bewirkt, dass alle ausstehenden Änderungen an Dateisystem-Metadaten und zwischengespeicherten Dateidaten in die zugrunde liegenden Dateisysteme geschrieben werden.

syncfs() ist wie sync() , sondern synchronisiert nur die Datei, die das Dateisystem enthält, auf das der offene Dateideskriptor fd verweist .

Beachten Sie das wann Die Rückgabe der Funktion ist nicht spezifiziert.

Das Linux Handbuchseite für fsync() Zustände:

fsync() überträgt ("löscht") alle modifizierten In-Core-Daten (d. h. modifizierte Puffer-Cache-Seiten für) der Datei, auf die durch den Dateideskriptor fd verwiesen wird auf die Festplatte (oder ein anderes permanentes Speichergerät), sodass alle geänderten Informationen abgerufen werden können, selbst wenn das System abstürzt oder neu gestartet wird. Dazu gehört das Durchschreiben oder Leeren des Festplatten-Cache, falls vorhanden. Der Anruf wird blockiert, bis das Gerät meldet, dass die Übertragung abgeschlossen ist.

Neben dem Leeren der Dateidaten, fsync() löscht auch die mit der Datei verknüpften Metadateninformationen (siehe inode(7)).

Rufen Sie fsync() an stellt nicht unbedingt sicher, dass der Eintrag im Verzeichnis, das die Datei enthält, auch auf der Platte angekommen ist. Dafür ein ausdrücklicher fsync() on ein Dateideskriptor für das Verzeichnis wird ebenfalls benötigt.

Beachten Sie, dass die Garantien, die Linux für fsync() bietet sind viel stärker als die für sync() bereitgestellten oder syncfs() , und von POSIX für beide fsync() und sync() .

Zusammengefasst:

  1. POSIX fsync() :"Bitte schreiben Sie Daten für diese Datei auf die Festplatte"
  2. POSIX sync() :"Schreibe alle Daten auf die Festplatte, wenn du dazu kommst"
  3. Linux sync() :"Alle Daten auf die Festplatte schreiben (wenn Sie dazu kommen?)"
  4. Linux syncfs() :"Alle Daten für das Dateisystem, das dieser Datei zugeordnet ist, auf die Festplatte schreiben (wenn Sie dazu kommen?)"
  5. Linux fsync() :"Schreibe alle Daten und Metadaten für diese Datei auf die Festplatte und kehre erst zurück, wenn du es getan hast"

Beachten Sie, dass die Linux-Manpage nicht angibt, wann sync() und syncfs() zurück.


Ich denke, die aktuelle Antwort ist nicht vollständig. Für Linux:

Gemäß der Standardspezifikation (z. B. POSIX.1-2001) sync() plant die Schreibvorgänge, kann aber zurückkehren, bevor das eigentliche Schreiben abgeschlossen ist. Linux wartet jedoch auf I/O-Abschlüsse und somit sync() odersyncfs() bieten dieselben Garantien wie fsync wird von jeder Datei im System bzw. Dateisystem aufgerufen.

und

Vor Version 1.3.20 wartete Linux nicht, bis die E/A abgeschlossen war, bevor es zurückkehrte.

Dies wird auf dem sync(2) erwähnt Seite in den Abschnitten "Notizen" und "Fehler".


Linux
  1. Der Unterschied zwischen [[ $a ==Z* ]] und [ $a ==Z* ]?

  2. Der Unterschied zwischen .exrc und .vimrc?

  3. Was ist der Unterschied zwischen strtok_r und strtok_s in C?

  4. Was ist der Unterschied zwischen fsck und e2fsck?

  5. Was ist der Unterschied zwischen ls und l?

Was ist der Unterschied zwischen Linux und Unix?

Was ist der Unterschied zwischen Login- und Non-Login-Shell

Was ist der Unterschied zwischen apt und dem Befehl apt-get?

Was ist ein Hypervisor? Was ist der Unterschied zwischen Typ 1 und 2?

Was ist der Unterschied zwischen Curl und Wget?

Was ist der Unterschied zwischen $(CC) und $CC?