Suponha que eu tenha 10 processos como:
process p0 with PID 1.
process p1 with PID 2.
process p2 with PID 3.
process p3 with PID 4.
process p4 with PID 5.
process p5 with PID 6.
process p6 with PID 7.
process p7 with PID 8.
process p8 with PID 9.
process p9 with PID 10.
Quando eu mato um processo, como:
kill 7
e o processo p6 é morto com sucesso, entre o processo p5 e p7 está vazio, quando executo o p10 como um processo, o kernel atribui o PID 11 ao p10.
A pergunta é por que o kernel (linux e freebsd) atribui um PID incremental em vez de atribuir o PID 7 ao processo p11?
Os PIDs não são reutilizados assim que são liberados porque isso resulta em corridas e, por fim, em bugs que às vezes podem ser usados para evitar restrições de segurança (veja estes exemplos de bugs de segurança do Android causados por corridas de PID ).
Se os PIDs forem reutilizados, os processos que mantêm um PID por qualquer motivo ( por exemplo , para enviar um sinal a algum outro processo) podem não perceber imediatamente que o processo com o qual pretendem se comunicar foi encerrado. Depois que o PID é reciclado, é difícil detectar com segurança que o processo que o utiliza mudou. Atrasar essa reutilização torna as corridas menos prováveis (embora não impossíveis). Outras abordagens incluem aumentar o PID máximo (como feito, por exemplo , no Fedora — veja
/proc/sys/kernel/pid_max
), mas novamente isso apenas reduz a probabilidade.O kernel Linux recentemente adicionou
pidfd
s para fornecer uma maneira confiável de raciocinar sobre processos e seus PIDs.