Pelo que vi online você chama o método kill em c++ para ver se o processo está vivo. o problema com isso é que os PIDs são rycleados e o mesmo PID que você está procurando pode não ser o mesmo processo. Eu tenho um programa que possui dois processos que não são filhos um do outro. A única maneira de se comunicar com eles é IPC. Eu gostaria que meu processo de host fosse encerrado quando o processo do cliente fosse encerrado. Para fazer isso, preciso saber quando o processo do cliente não está mais ativo.
No Windows, eles têm o que é chamado de manipulador de processo que reservará o PID de ser reciclado até que o processo que criou o identificador seja encerrado. Estou me perguntando como conseguir isso para sistemas macOS/Linux (POSIX).
O código problemático como PIDs são reciclados.
if (0 == kill(pid, 0))
{
// Process exists.
}
Exatamente, então essa
kill
abordagem não funciona. Realmente, fim da história aí. Não é uma ferramenta de trabalho para isso.Duas opções:
waitpid
destina-se exatamente a assistir quando sairwaitpid
). Você pode esperar ter privilégios de "rastreamento" e usarptrace
para anexar a outro processo e aguardarexit
chamadas.A solução é reservar o PID no Windows armazenando em cache e não fechando o arquivo
process handle
. ParaPOSIX
sistemas, simplesmente obtemos a hora de início do processo do kernalOS DEPENDANT!
e, em seguida, verificamos se a hora de início armazenada em cache é igual à hora de início atual. Se não, um conflito de PID é detectado e retorna falso.Janelas:
Mac OS:
Linux: