É uma operação de movimento no Unix atômica?
Suponha que existem 2 processos P1 e P2, e eles acessam um arquivo compartilhadoFoo.txt
.
Suponha que P2 esteja lendo deFoo.txt
. Eu não quero que o P1 escreva paraFoo.txt
enquanto P2 está lendo.
Então eu pensei em fazer o P1 escrever paraFoo.tmp
e como último passo, renomeieFoo.tmp
paraFoo.txt
. Minha linguagem de programação é Java
Então, minha pergunta é, isso garantiria que P2 lesse os dados corretos deFoo.txt
? A operação de renomeação seria confirmada quando P2 concluísse a leitura do arquivo?
EDITAR
Eu tentei recriar esse cenário da seguinte maneira:
Meu código P1 é algo assim:
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);
e meu código P2 é:
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();
}
Meu arquivo compartilhado de amostra:
Test Input
Test Input
Test Input
Estou começando P1 e P2 quase simultaneamente (P2 começando primeiro).
Então, de acordo com o meu entendimento, apesar de P1 ter escrito um novo Foo.txt, já que o P2 já está lendo, ele deve ler o conteúdo antigo do Foo.txt até que ele reabra um BufferedReader para Foo.txt.
Mas o que realmente acontece é P2 lêTest Input
três vezes, como é esperado a partir da entrada, mas depois que lê o novo conteúdo que foi escrito por P1.
Saída de P2:
Test Input
Test Input
Test Input
Hello World
Hello World
Hello World
.
.
.
Então não funciona como deveria. Estou testando esse cenário errado? Eu sinto que há algo que estou perdendo.