Após alguns breves testes, eu diria que sua suposição parece estar correta. Se você quiser confirmar isso, recomendo Processar Hacker . (Há um botão "Downloads" no topo; tenha cuidado, pois os anúncios estão mostrando links de download inválidos.) Hacker, Encontrar Identificadores ou DLLs ... (Ctrl-F)
Com isso, você pode verificar facilmente o que está usando o arquivo e, ao executar novamente a pesquisa, pode verificar quando o arquivo é liberado.
Espero que o Process Explorer também possa fazer isso de maneira semelhante.
Note que pode ser melhor escrever para um nome de arquivo único ... considere isto: ao invés de output_1.txt a primeira sub-chamada, e output_2.txt a segunda sub-chamada, verifique quais arquivos preexistem. Em seguida, vá mais alto, para que você não acabe sobrescrevendo um arquivo ou encontrando problemas porque não pode anexá-lo porque o arquivo está em uso. Sistemas operacionais e linguagens de programação frequentemente fornecem funcionalidade para gerar um nome de arquivo exclusivo.
Você pode querer gravar em muitos arquivos temporários e combiná-los em menos arquivos. Se essa ideia faz muito sentido, ou absolutamente nenhuma, pode depender do seu projeto e de como você aborda as coisas.
Se você tiver o código-fonte para program.exe, em vez de executar "program.exe > filename", basta usar "program.exe filename". Coloque o código em seu programa para gravar o arquivo rapidamente e, em seguida, feche o arquivo para que ele não seja mais retido quando não houver uma gravação ativa. (Um processo mais completo pode até mesmo executar algum "bloqueio" ... já que você está executando várias cópias do programa, que podem realmente valer a pena investir.) Em vez de chamar printf (), use uma função customizada que só chama printf () se não houver arquivo de saída especificado, caso contrário, ele gravará em um arquivo. Então, em vez de precisar alterar todas as suas chamadas printf () toda vez que você alterar o arquivo de saída, basta alterar o valor de uma variável que é passada para sua função de saída personalizada. Eu sei que você disse que isso pode não ser preferível devido à necessidade de levar mais tempo. No entanto, eu vou deixar você saber que eu, pessoalmente, me economizei muito tempo e esforço depois que eu encontrei essa abordagem. Eu vejo isso como uma boa solução a longo prazo.
Ou considere o uso da funcionalidade de registro em log do sistema operacional. Isto pode ser feito executando um comando a partir da linha de comando: No Unix, execute o "logger"; no MS Windows, execute EventCreate . Deveria haver maneiras de fazer isso diretamente da sua escolha de linguagem de programação (MSDN C, como você observou). Isso pode ser útil se a saída for demorada ou se você estiver preocupado com a sobrecarga dos logs do sistema operacional. (Eu sei que alguns lugares têm monitoramento ativo de logs do sistema operacional.)