Ruft close () fsync () unter Linux auf? [Duplikat]

8

Wenn wir close(<fd>) aufrufen, macht fsync() automatisch eine Synchronisierung mit den physischen Medien?

    
user1783732 11.03.2013, 20:55
quelle

3 Antworten

9

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).

    
Jesus Ramos 11.03.2013, 20:57
quelle
1

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.)

    
John Carter 11.03.2013 20:59
quelle
0

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.

    
Tuxdude 11.03.2013 21:00
quelle

Tags und Links