Você pode simplificar sua primeira solução proposta:
regenere o arquivo em myfile.new
e renomeie ( mv
) para myfile
.
Se você estava substituindo myfile
pelos novos dados, um leitor assíncrono
poderia obter dados corrompidos (ou, pelo menos, incompletos) - mas você já sabe disso.
Tenho certeza de que qualquer uma das suas soluções propostas estaria segura.
Se outro processo abrir a versão 12:34 do arquivo às 12:38,
então ele continuará tendo aquele arquivo aberto para leitura
depois de renomear a versão 12:39 do arquivo para myfile
,
mesmo que não apareça mais em nenhum diretório.
Isso é ainda mais claro no segundo caso,
onde a versão 12:34 fica no diretório
depois de alterar o link simbólico para apontar para o arquivo 12:39.