2013-03-11 5 views

Antwort

9

Es nicht. Der Aufruf von close() garantiert NICHT, dass sich Inhalte auf der Festplatte befinden, da das Betriebssystem die Schreibvorgänge möglicherweise zurückgestellt hat.

Als Randnotiz immer den Rückgabewert close() überprüfen. 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 zu beachten ist, was der Backing Store ist. Es gibt Geräte, die interne Schreibverzögerungen ausfü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).

+0

Aufruf von 'fsync()' * tut auch nicht *, aus den gleichen Gründen (die Hardware könnte die Schreibvorgänge zurückgestellt haben). –

+0

@ FrédéricHamidi 'fsync()' erzwingt die Schreibvorgänge im Speicher, unter welchen Bedingungen würde fsync den Inhalt auf dem Datenträger nicht garantieren (außer ungeraden Fehlern und verzögerten Hardware-Schreibvorgängen, die in einigen Fällen nicht kontrolliert werden können)? –

+0

Möglicherweise befindet sich (und normalerweise) eine weitere Cache-Schicht im Festplatten-Controller, so dass selbst 'fsync()' nicht garantieren kann, dass Ihre Daten die tatsächliche Hardware erreicht haben. Die [Manpage] (http://linux.die.net/man/2/close) für 'close()' erwähnt dies. –

1

Nr

Von man 2 close

einem erfolgreichen Abschluss garantiert nicht, dass die Daten erfolgreich auf Festplatte gespeichert wurde, als der Kernel schreibt aufschiebt. Es ist nicht üblich für ein Dateisystem die Puffer zu löschen, wenn der Stream geschlossen ist. Wenn Sie sicher sein müssen, dass die Daten physikalisch gespeichert sind, verwenden Sie fsync (2). (Es wird an dieser Stelle auf der Festplatte Hardware abhängig.)

0

Von man 2 close:

ein erfolgreichen Abschluss garantiert nicht, dass die Daten erfolgreich auf Festplatte gespeichert werden, als der Kernel schreibt aufschiebt . Es ist nicht üblich für ein Dateisystem, die Puffer zu leeren, wenn der Stream geschlossen ist. Wenn Sie sicherstellen müssen, dass die Daten physisch gespeichert werden, verwenden Sie fsync (2). (Es wird an dieser Stelle auf der Festplatte hart ware abhängen.)

Ihre Frage zu beantworten, NO, close() garantiert nicht fsync()

close nur die Beschreibungsdatei schließt für den Prozess und entfernt alle mit dem Prozess verbundenen Datensatzsperren.