Tenho uma aplicação que roda externamente um compilador. Em seguida, roda uma outra ferramenta que usa o resultado da compilação para realizar uma série de tarefas. Ambas são escritas em C.
Disparo essas duas aplicações através do Java, usando para isso as classes ProcessBuilder e Process. Aguardo o termino da execução usando waitFor() e depois disso garanto a leitura completo de ambas as streams de saída.
Agora, observei um comportamento estranho: algumas vezes o compilador roda e o Java dispara a outra ferramenta antes que o arquivo gerado por ele esteja completamente gravado no disco. É como se o sistema operacional (no nosso caso o Windows), indicasse ao Java que o processo terminou antes de dar completamente o flush nos arquivos.
Tenho certeza que não é a ferramente que está gerando o arquivo pela metade, pois já conferi isso. Mesmo nas situações onde o erro ocorre, olhar o arquivo externamente mostra um arquivo completo.
Então pergunto. Existe alguma forma de garantir esse flush, seja ela no Java ou no próprio C? No C, a aplicação faz flush() normalmente antes de finalizar.