Czy operacja przenoszenia w atomowym systemie Unix?

Załóżmy, że istnieją 2 procesy P1 i P2 i uzyskują dostęp do współdzielonego plikuFoo.txt.

Załóżmy, że P2 czyta zFoo.txt. Nie chcę, aby P1 zapisywał daneFoo.txt podczas gdy P2 to czyta.

Pomyślałem więc, że mogę napisać do P1Foo.tmp i jako ostatni krok zmień nazwęFoo.tmp doFoo.txt. Moim językiem programowania jest Java

Moje pytanie brzmi, czy to zapewni, że P2 odczytuje poprawne daneFoo.txt? Czy operacja zmiany nazwy zostanie zatwierdzona, gdy P2 zakończy czytanie pliku?

EDYTOWAĆ

Próbowałem odtworzyć ten scenariusz w następujący sposób:

Mój kod P1 wygląda mniej więcej tak:

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);

a mój kod P2 to:

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();
}

Mój przykładowy plik udostępniony:

Test Input
Test Input
Test Input   

Zaczynam P1 i P2 prawie jednocześnie (P2 zaczyna się od początku).

Zgodnie z moim zrozumieniem, mimo że P1 napisał nowy plik Foo.txt, ponieważ P2 już go czyta, powinien przeczytać starą zawartość Foo.txt, aż ponownie otworzy BufferedReader na Foo.txt.

Ale tak naprawdę to P2 czytaTest Input trzykrotnie, jak oczekuje się od danych wejściowych, ale potem odczytuje nową treść, która została napisana przez P1.

Wyjście z P2:

Test Input
Test Input
Test Input 
Hello World
Hello World
Hello World
 .
 .
 .

Więc to nie działa tak, jak powinno. Czy testuję ten scenariusz źle? Czuję, że czegoś brakuje.

questionAnswers(3)

yourAnswerToTheQuestion