Wir haben eine Datei, die Daten enthält, die immer konsistent sein müssen. Wenn sie geändert werden müssen, Process 1
wird eine neue Datei erstellt, die Änderungen in die neue Datei geschrieben und mv
die neue Datei wird mit dem alten Dateinamen umbenannt.
Wenn wir einen anderen Prozess haben, Process 2
der diese Datei lesen muss, wie können wir garantieren, dass er immer eine konsistente Datei liest, d. h. dass ein „ mv
By“ Process 1
während des Lesens keine Datenbeschädigung verursachen kann?
Antwort1
Sie garantieren dies, indem Sie die neue Datei auf demselben Dateisystem wie die alte Datei erstellen und die rename(2)
Funktion [1] verwenden, die garantiert atomar ist.
Auf Unix-Dateisystemen rename(2)
wirkt sich a nur auf die Verzeichniseinträge aus; es wirkt sich nicht auf Prozesse aus, die einen offenen Handle zu dem Inode haben, auf den der ursprüngliche Verzeichniseintrag zeigt; dieser Prozess liest bzw. schreibt weiterhin in die alte Datei.
Normalerweise ruft das mv(1)
Dienstprogramm einfach auf rename(2)
, aber es kann auf „Entfernen + Kopieren“ oder andere zweifelhafte nichtatomare Operationen zurückgreifen, falls dies rename(2)
fehlschlägt.
Beachten Sie, dass das Vorhandensein von zwei Dateien auf demselben Dateisystem keine Garantie für den rename(2)
Erfolg ist. Es gibt Dateisysteme, 9pfs
die eine Umbenennungsoperation nicht unterstützen, sodass sie auf die eine oder andere Weise erstellt werden muss.
[1] oder noch besser, renameat(2)
das verhindert, dass die führenden Pfade zu den Dateien heimlich von einem anderen Prozess aus geändert werden, also durch "Symlink-Angriffe".