Ist eine Verschiebeoperation in Unix atomar?
Angenommen, es gibt zwei Prozesse P1 und P2, die auf eine gemeinsam genutzte Datei zugreifenFoo.txt
.
Angenommen, P2 liest ausFoo.txt
. Ich möchte nicht, dass P1 schreibtFoo.txt
während P2 es liest.
Also dachte ich, ich könnte P1 zum Schreiben bringenFoo.tmp
und als letzten schritt umbenennenFoo.tmp
zuFoo.txt
. Meine Programmiersprache ist Java
Meine Frage ist also, ob dies sicherstellen würde, dass P2 die richtigen Daten liestFoo.txt
? Würde die Umbenennungsoperation festgeschrieben, sobald P2 das Lesen der Datei abgeschlossen hat?
BEARBEITEN
Ich habe versucht, dieses Szenario wie folgt neu zu erstellen:
Mein P1-Code sieht ungefähr so aus:
File tempFile = new File(path1);
File realFile = new File(path2);
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
for(int i=0;i<10000;i++)
writer.write("Hello World\n");
writer.flush();
writer.close();
tempFile.renameTo(realFile);
und mein P2 Code ist:
BufferedReader br = new BufferedReader(new FileReader(file));
String line = null;
while(true) {
while((line=br.readLine())!=null){
System.out.println(line);
Thread.sleep(1000);
}
br.close();
}
Meine gemeinsame Beispieldatei:
Test Input
Test Input
Test Input
Ich starte P1 und P2 fast gleichzeitig (P2 startet zuerst).
Obwohl P1 eine neue Foo.txt geschrieben hat, sollte es meines Wissens nach den alten Foo.txt-Inhalt lesen, bis es einen BufferedReader zu Foo.txt erneut öffnet, da P2 ihn bereits liest.
Was aber tatsächlich passiert, ist P2 liestTest Input
dreimal, wie es von der Eingabe erwartet wird, aber danach liest es den neuen Inhalt, der von P1 geschrieben wurde.
Ausgabe von P2:
Test Input
Test Input
Test Input
Hello World
Hello World
Hello World
.
.
.
Es funktioniert also nicht so, wie es sollte. Teste ich dieses Szenario falsch? Ich habe das Gefühl, dass ich etwas verpasse.