FSYNC(2)

BEZEICHNUNG
fsync, fdatasync - den gepufferten Dateiinhalt mit einem Datenträger synchronisieren

ÜBERSICHT
#include <unistd.h>

int fsync(int fd);

int fdatasync(int fd);

Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

fsync(): _BSD_SOURCE || _XOPEN_SOURCE
         || /* seit Glibc 2.8: */ _POSIX_C_SOURCE >= 200112L
fdatasync(): _POSIX_C_SOURCE >= 199309L || _XOPEN_SOURCE >=500

BESCHREIBUNG
fsync() überträgt alle veränderten gepufferten Daten (d.h. geänderte Seiten des Pufferzwischenspeichers) von der Datei, auf die der Dateideskriptor fd weist, auf die Platte (oder ein anderes dauerhaftes Speichermedium) auf dem die Datei liegt. Der Aufruf blockiert bis das Gerät meldet, dass die Übertragung vollständig ist. Außerdem werden Metadaten-Informationen übertragen, die mit der Datei verknüpft sind (siehe stat(2)). Der Aufruf von fsync() garantiert nicht, dass der Verzeichniseintrag der Datei die Platte erreicht. Dafür wird auch ein explizites fsync() auf einem Dateideskriptor des Verzeichnisses benötigt. fdatasync() ist fsync() ähnlich, überträgt aber keine geänderten Metadaten, sofern diese Metadaten nicht benötigt werden, um die korrekte Handhabung einer nachfolgenden Datenabfrage zu ermöglichen. Änderungen an st_atime oder st_mtime (Zeit des letzten Zugriffs und Zeit der letzten Änderung; siehe stat(2)) erfordern zum Beispiel keine Übertragung, da sie nicht für die korrekte Handhabung eines nachfolgenden Lesens der Daten benötigt werden. Andererseits würde die Änderung der Dateigröße (st_size, wie sie von ftruncate(2) vorgenommen wird) ein Übertragen der Metadaten erfordern. Das Ziel von fdatasync() ist die Verminderung der Plattenaktivität durch Anwendungen, die nicht das Synchronisieren aller Metadaten mit der Platte erfordern.

RÜCKGABEWERT
Bei Erfolg gibt dieser Systemaufruf Null zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

EBADF
    fd ist kein gültiger, zum Schreiben geöffneter Dateideskriptor.

EIO Während der Synchronisation ist ein Fehler aufgetreten.

EROFS, EINVAL
    fd ist mit einer Spezialdatei verbunden, die keine Synchronisation unterstützt.

KONFORM ZU
4.3BSD, POSIX.1-2001.

VERFÜGBARKEIT
Auf POSIX-Systemen, auf denen fdatasync() verfügbar ist, ist _POSIX_SYNCHRONIZED_IO in <unistd.h> als ein Wert größer als 0 definiert. (Siehe auch sysconf(3).)

ANMERKUNGEN
Anwendungen, die auf Datenbanken oder Protokolldateien zugreifen, schreiben oft ein winziges Datenfragment (z.B. eine Zeile in einer Protokolldatei) und rufen dann sofort fsync() auf, um sicherzustellen, dass die geschriebenen Daten physisch auf der Festplatte gespeichert werden. Unglücklicherweise wird fsync() immer zwei Schreiboperationen anstoßen: eine für die neu geschriebenen Daten und eine andere, um die im Inode gespeicherte Änderungszeit zu aktualisieren. Falls die Änderungszeit nicht Teil des Transaktionskonzeptes ist, kann fdatasync() benutzt werden, um unnötige Inode-Plattenschreiboperationen zu vermeiden. Wenn bei der zugrundeliegenden Festplatte die Zwischenspeicherung beim Schreiben eingeschaltet ist, dann kann es sein, dass die Daten bei der Rückkehr von fsync()/fdatasync() nicht wirklich im dauerhaften Speicher liegen.

Falls ein Ext2-Dateisystem mit der Option sync eingehängt ist, werden außerdem auch Verzeichniseinträge implizit mittels fsync() synchronisiert.

Auf Kerneln vor 2.4 kann fsync() bei großen Dateien ineffizient sein. Eine Alternative könnte die Benutzung des Schalters O_SYNC für open(2) sein. Bis einschließlich Linux 2.2 entspricht fdatasync() fsync() und steigert daher nicht die Leistung.

SIEHE AUCH
bdflush(2), open(2), sync(2), sync_file_range(2), hdparm(8), mount(8), sync(8), update(8)

KOLOPHON
Diese Seite ist Teil der Veröffentlichung 3.27 des Projekts Linux-man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, finden sich unter http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von Chris Leick <c.leick@vollbio.de> erstellt. Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen. Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an <debian-l10n-german@lists.debian.org>.