Unterschied zwischen fflush und fsync
Dachte ich fsync() fflush() intern mit fsync() auf einem stream ist OK. Aber ich bin immer unerwartetes Ergebnis bei der Ausführung unter Netzwerk-I/O.
Mein code-snippet:
FILE* fp = fopen(file,"wb");
/* multiple fputs() call like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* get fd of the FILE pointer */
fd = fileno(fp);
#ifndef WIN32
ret = fsync(fd);
#else
ret = _commit(fd);
fclose(fp);
Aber es scheint _commit() ist nicht das Spülen der Daten (ich habe versucht, auf Windows und die Daten wurde geschrieben, auf Linux exportierten Dateisystem).
Wenn ich änderte den code:
FILE* fp = fopen(file,"wb");
/* multiple fputs() call like: */
fputs(buf, fp);
...
...
fputs(buf.c_str(), fp);
/* fflush the data */
fflush(fp);
fclose(fp);
Dieser Zeit und es spült die Daten.
Frage ich mich, ob _commit() tut das gleiche wie fflush(). Alle Eingänge?
InformationsquelleAutor der Frage Adil | 2010-02-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
fflush()
funktioniert aufFILE*
es nur leert den internen Puffer, in denFILE*
Ihrer Anwendung an das Betriebssystem.fsync
arbeitet auf einem niedrigeren Niveau, es sagt dem OS zu Spülen, seinen Puffer zu den physischen Medien.OSs stark cache-Daten, die Sie in eine Datei schreiben. Wenn der OS durchgesetzt, dass auf jeden Schreibvorgang zu schlagen, die fahren, wäre es sehr langsam.
fsync
(unter anderem) können Sie Steuern, Wann die Daten treffen sollte das Laufwerk.Darüber hinaus fsync/commit arbeiten auf einem Datei-Deskriptor. Es hat keine Kenntnis von einem
FILE*
und kann nicht bündig seine Puffer.FILE*
lebt Sie in Ihrer Anwendung Datei-Deskriptoren, Leben in der OS-kernel, in der Regel.InformationsquelleAutor der Antwort nos
Den standard-C-Funktion
fflush()
und die POSIX system callfsync()
sind konzeptionell ähnlich.fflush()
arbeitet auf C-Datei-streams (FILE
Objekte), und ist daher tragbar.fsync()
arbeiten auf POSIX-file-descriptors.Sowohl Ursache als die gepufferten Daten werden an ein Ziel gesendet wurde.
Auf einem POSIX-system, wird jede C-Datei-stream hat einer zugehörigen Datei-Deskriptorund alle Operationen, die auf einer C-Datei-stream implementiert, durch delegieren, wenn nötig, um die POSIX-Systemaufrufe arbeiten auf der file-Deskriptor.
Könnte man denken, dass ein Aufruf
fflush
auf einem POSIX-system verursachen würdewrite
von Daten in den Puffer der Datei stream, gefolgt von einem Aufruf vonfsync()
für den file-Deskriptor der Datei-stream. Also auf einem POSIX-system gäbe es keine Notwendigkeit zu Folgen, einen Anruf zufflush
mit einem Aufruffsync(fileno(fp))
. Aber ist das der Fall: ist es ein Aufruffsync
ausfflush
?Nein, ruft
fflush
auf einem POSIX-system bedeutet nicht, dassfsync
aufgerufen werden.C-standard für
fflush
sagt (Hervorhebung Hinzugefügt) esSagen, dass die Daten werden geschrieben, sondern als das, ist ist geschrieben impliziert, dass die weitere Pufferung durch die host-Umgebung zulässig ist. Dass die Pufferung durch die "host-Umgebung" umfassen könnte, für eine POSIX-Umgebung, die interne Pufferung, dass
fsync
spült. So ein close reading der C-standard legt nahe, dass der standard verlangt nicht die POSIX-Implementierung zu nennenfsync
.Den POSIX-standard Beschreibung
fflush
nicht erklären, wie ein Erweiterung der C-Semantikdassfsync
genannt wird.InformationsquelleAutor der Antwort Raedwald
Könnte ich sagen, dass der Einfachheit halber:
verwenden
fsync()
mit nicht-streaming-Dateien (integer-file-Deskriptoren)verwenden
fflush()
mit Datei-streams.Auch hier ist die Hilfe von Mensch:
InformationsquelleAutor der Antwort pulse
Zwingen das Engagement der letzten änderungen auf der Festplatte, verwenden Sie die sync () - oder fsync () - Funktionen.
fsync() synchronisiert alle aus der angegebenen Datei werden die Daten und Metadaten mit den permanenten Speicher-Gerät. Es sollte aufgerufen werden, einfach vor die entsprechende Datei geschlossen wurde.
sync() verpflichten sich, alle geänderten Dateien auf der Festplatte.
InformationsquelleAutor der Antwort user3428045
Ich denke, unten Dokument von python (https://docs.python.org/2/library/os.html) verdeutlicht es sehr gut.
InformationsquelleAutor der Antwort poordeveloper