política de atribuição de PID no Windows / Usando PIDs para nomear arquivos temporários
-
13-09-2019 - |
Pergunta
-
Qual é a política de atribuição de PID no Windows? corridas repetidas de um _getpid chamando processo () indica a atribuição sequencial não (3548,3344,3628,2748,4872,2360).
-
Dada a atribuição sequencial não observado de PIDs, é possível que dois processos diferentes com o mesmo PID a ser executado em estreita colaboração com o tempo um do outro? Obviamente, os processos não seriam executados simultaneamente.
-
É particularmente prudente usar um PID na nomeação de arquivos temporários?
Eu estou escrevendo um programa que interage com outro executável, gerando os arquivos de entrada necessários, chamando o executável, e ler os arquivos de saída gerados a partir da dita executável. Após o término limpar os arquivos intermediários são excluídos.
A minha preocupação é que, se os arquivos temporários não são limpos e se PIDs são reutilizados poderia haver uma ambiguidade entre antigos arquivos temporários que não foram limpos e novos arquivos. Se o executável não gera um novo arquivo de saída devido a um erro no arquivo de idade poderia aparecer como o arquivo recém-criado, portanto, o erro não pode ser capturado.
Existem outras maneiras de adicionar robustez como o uso de um GUID para os arquivos temporários, usando apenas diretórios limpas para arquivos temporários, ou verificar que não existem arquivos que compartilham o mesmo nome que o arquivo de saída de destino. Algumas destas técnicas devem ser empregadas desde PIDs são determinados a ser repetido após a reinicialização da máquina ou se a máquina estiver a funcionar durante um período de tempo suficiente.
A questão decorre principalmente da minha curiosidade sobre por que o Windows alocar PIDs de uma maneira diferente, então * nix.
Solução
Usando um PID desta forma é problemático. Já vi programas que usam o PID em conjunto com a hora UTC atual ao nomear arquivos para que você acabar com arquivos chamados foo_55145_4a3667d3.log
. A outra opção usar as opções FILE_ATTRIBUTE_TEMPORARY
e FILE_FLAG_DELETE_ON_CLOSE
no dwFlagsAndAttributes
parâmetro para CreateFile()
.
Outras dicas
IDs de processo e IDs de Tópicos vêm da mesma piscina no Windows. O sistema irá reutilizar threads e processar IDs imediatamente.