Dies ist eine sehr späte Antwort, aber ... ja rename()
ist atomar, aber nicht im Sinne Ihrer Frage. Unter Linux rename(2)
sagt:
Allerdings erscheint beim Überschreiben wahrscheinlich ein Fenster, in dem sowohl oldpath als auch newpath auf die umzubenennende Datei verweisen.
Aber rename()
ist immer noch in einem sehr wichtigen Sinne atomar:Wenn Sie damit eine Datei überschreiben, erhalten Sie am Ende entweder die alte oder die neue Version und sonst nichts.
[aktualisieren: aber wie @jonas-wielicki in den Kommentaren betont, müssen Sie sicherstellen, dass die Datei, die Sie umbenennen, tatsächlich den aktuellen Inhalt hat, indem Sie fsync()
verwenden und Freunde.]
Wenn newpath bereits existiert, wird es atomar ersetzt (vorbehaltlich einiger Bedingungen; siehe FEHLER unten), so dass es keinen Punkt gibt, an dem ein anderer Prozess, der versucht, auf newpath zuzugreifen, es als fehlend feststellt.
Wenn Sie ERRORS sehen, werden Sie feststellen, dass die Umbenennung möglicherweise fehlschlägt, aber niemals die Atomarität aufhebt.
Dies ist alles von der Linux-Manpage. Was ich nicht weiß, ist, ob Sie einen rename()
machen auf einem Netzwerkdateisystem, auf dem der Server ein anderes Betriebssystem ausführt. Hat der Client dann eine höllische Hoffnung, die Atomarität zu garantieren? Ich bezweifle es.
Ja und nein.
rename() ist atomar, vorausgesetzt, das Betriebssystem stürzt nicht ab. Es kann nicht von anderen Dateisystemoperationen geteilt werden.
Wenn das System abstürzt, sehen Sie möglicherweise stattdessen eine ln()-Operation.
Beachten Sie auch, dass Sie beim Betrieb auf einem Netzwerkdateisystem möglicherweise ENOENT erhalten, wenn der Vorgang erfolgreich war. Das lokale Dateisystem kann Ihnen das nicht antun.
Ich bin mir nicht sicher, ob der "grundsätzlich" Teil Ihrer Frage gültig ist. Sofern Sie keine Art von Synchronisation zwischen den beiden haben, spielt es keine Rolle, wie atomar die Umbenennung ist. Wenn die Verzeichniskopie vor der Umbenennung dort ankommt, haben Sie Datei1 an beiden Stellen.
Ich bin mir nicht sicher, ob Sie Threads oder Prozesse meinten, aber wenn es Sperrmechanismen für beide gibt, sind Threading-Sperren bei weitem die einfachsten, da sie Prozessgrenzen nicht überschreiten müssen.