Was passiert, wenn Sie eine Datei lesen, während sie überschrieben wird?

Antworten:

19

Das hängt davon ab, was der Autor tut.

Wenn der Schreiber die vorhandene Datei überschreibt, sieht der Leser den neuen Inhalt, wenn der Schreiber den Leser überholt, falls überhaupt. Wenn der Schreiber und der Leser mit variabler Geschwindigkeit vorgehen, kann der Leser alternativ alte und neue Inhalte sehen.

Wenn der Writer die Datei vor dem Schreiben abschneidet, wird der Reader an diesem Punkt am Ende der Datei ausgeführt.

Wenn der Schreiber eine neue Datei erstellt und dann die neue Datei auf den alten Namen verschiebt, liest der Leser weiter aus der alten Datei. Wenn eine geöffnete Datei verschoben oder entfernt wird, lesen die Prozesse, bei denen die Datei geöffnet wurde, weiterhin aus derselben Datei. Wenn die Datei entfernt wird, verbleibt sie tatsächlich auf dem Datenträger (kann jedoch nicht erneut geöffnet werden), bis sie vom letzten Vorgang geschlossen wurde.

Unix-Systeme haben in der Regel keine obligatorischen Sperren . Wenn eine Anwendung sicherstellen möchte, dass sich die Writer- und Reader-Komponente nicht gegenseitig berühren, muss der Entwickler die richtige Sperrung verwenden. Es gibt einige Ausnahmen, in denen eine Datei, die vom Kernel geöffnet wird, vor dem Schreiben durch Benutzeranwendungen geschützt werden kann, z. B. ein Dateisystem-Image mit Schleifenmontage oder eine ausführbare Datei, die auf einigen Unix-Varianten ausgeführt wird.

Gilles 'SO - hör auf böse zu sein'
quelle
Gilles, trifft Ihre Erklärung auch auf ftp/ sftpscenarios zu? Angenommen, ein Prozess beginnt mit dem Lesen einer übertragenen ftpDatei, während eine andere Version derselben Datei diese aufgrund einer neuen Übertragung überschreibt.
Iruvar
@ 1_CR Ja. In diesem Fall sind der Schreiber und der Leser die FTP-Prozesse.
Gilles 'SO- hör auf böse zu sein'
Was bedeutet hier überholen?
Victor Choy
@VictorChoy Standardbedeutung: hinter / hinter jemandem beginnen und irgendwann vor ihm hergehen.
Gilles 'SO - hör auf böse zu sein'
18

Es ist eine klassische Rennbedingung, daher ist das Ergebnis per Definition nicht vorhersehbar.

Unter anderem kommt es darauf an

  • fopen(3)oder open(2)Schreibmodi,
  • wie / ob der Schreiber seine Ausgabe puffert,
  • wie der Leser die Datei liest,
  • der Geschwindigkeitsunterschied zwischen dem Leser und dem Schreiber,
  • die Zeitdifferenz zwischen dem Start des Lesens und des Schreibens.
  • Bei modernen Multi-Core-Maschinen werden die Dinge natürlich durch andere Faktoren (z. B. die Prozessplanung) noch komplizierter.

Wenn Sie in der Lage sein müssen, eine Datei zu lesen, während sie neu geschrieben wird, können Sie den Writer veranlassen, eine vorübergehende Kopie der Datei zu erstellen, diese zu ändern und dann in die ursprüngliche Datei zurück zu kopieren. So rsyncmacht das zum Beispiel der Weg . Es gibt eine Reihe von Möglichkeiten, dies umzusetzen, aber kein kostenloses Mittagessen. Jede Methode hat ihre eigenen Mängel und Auswirkungen.

Alexios
quelle
1
Diese Antwort ist weitaus umfassender als meine. Meine Antwort löschen.
Killermist
0

Vorherige Antwortende haben ausführlichere Erklärungen als diese, aber hier ist ein Trick, der definitiv auch funktioniert und so ziemlich genau das tut, was er will:

$ tail -f <filename>

Zeigt Ihnen das Ende der Datei, während sie geschrieben wird. Praktisch, wenn Sie STDERR an eine Datei weiterleiten möchten, diese aber beispielsweise in einem anderen Terminalfenster anzeigen möchten.

Willoughby Will
quelle