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.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage