Wenn wir close(<fd>)
aufrufen, macht fsync()
automatisch eine Synchronisierung mit den physischen Medien?
Es tut es nicht. Der Aufruf von close()
garantiert NICHT, dass sich Inhalte auf dem Datenträger befinden, da das Betriebssystem die Schreibvorgänge möglicherweise zurückgestellt hat.
Überprüfen Sie als Randnotiz immer den Rückgabewert von close()
. Es wird Sie über alle bis zu diesem Zeitpunkt zurückgestellten Fehler informieren. Wenn Sie sicherstellen möchten, dass sich die Inhalte auf der Festplatte befinden, rufen Sie immer fsync()
auf und überprüfen Sie auch deren Rückgabewert.
Eine Sache, die Sie beachten sollten, ist, was der Backing Store ist. Es gibt Geräte, die interne Schreibverzögerungen durchführen können und Inhalte können in einigen Fällen verloren gehen (obwohl neuere Speichermediengeräte typischerweise Superkondensatoren haben, um dies zu verhindern, oder Möglichkeiten, diese Funktion zu deaktivieren).
Nein.
Von man 2 close
Ein erfolgreicher Abschluss garantiert nicht, dass die Daten vorhanden waren erfolgreich auf Festplatte gespeichert, da der Kernel Schreibvorgänge verzögert. Es Es ist nicht üblich, dass ein Dateisystem die Puffer löscht, wenn der Stream geschlossen ist. Wenn Sie sicher sein müssen, dass die Daten sind physisch gespeicherte Verwendung fsync (2). (Dies hängt von der Festplatten-Hardware ab.)
Von man 2 close
:
Ein erfolgreicher Abschluss garantiert nicht, dass die Daten vorhanden waren erfolgreich auf Festplatte gespeichert, da der Kernel Schreibvorgänge verzögert. Es ist nicht üblich für ein Dateisystem, um die Puffer zu löschen, wenn der Stream ist geschlossen. Wenn Sie sicher sein müssen, dass die Daten physisch gespeichert werden, verwenden Sie fsync (2). (Dies hängt von der Festplatten-Hardware ab.)
Um Ihre Frage zu beantworten, NEIN garantiert close()
nicht fsync()
close
schließt nur den Dateideskriptor für den Prozess und entfernt alle mit dem Prozess verknüpften Datensatzsperren.