Digamos, do kernel 2.6 em diante.
Eu assisto todos os processos em execução no sistema.
O PID dos filhos é sempre maior que o PID dos pais?
É possível ter casos especiais de "inversão"?
Digamos, do kernel 2.6 em diante.
Eu assisto todos os processos em execução no sistema.
O PID dos filhos é sempre maior que o PID dos pais?
É possível ter casos especiais de "inversão"?
Não, pela simples razão de que existe um valor numérico máximo que o PID pode ter. Se um processo tem o PID mais alto, nenhum filho que ele bifurca pode ter um PID maior. A alternativa para dar à criança um PID mais baixo seria reprovar
fork()
completamente, o que não seria muito produtivo.Os PIDs são alocados em ordem e, depois que o mais alto é usado, o sistema volta a reutilizar os mais baixos (gratuitos), para que você também possa obter PIDs mais baixos para um filho em outros casos.
O PID máximo padrão no meu sistema (
/proc/sys/kernel/pid_max
) é apenas 32768, então não é difícil alcançar a condição em que o wraparound acontece.Se o seu sistema alocasse PIDs aleatoriamente ( como o OpenBSD parece fazer ) em vez de consecutivamente (como o Linux), haveria duas opções. Ou a escolha aleatória foi feita em todo o espaço de PIDs possíveis, caso em que seria óbvio que o PID de uma criança pode ser menor que o dos pais. Ou, o PID da criança seria escolhido aleatoriamente entre os valores maiores que o PID dos pais, o que em média o colocaria no meio do caminho entre o PID dos pais e o máximo. Os processos bifurcando recursivamente atingiriam rapidamente o máximo e estaríamos no mesmo ponto mencionado acima: um novo fork precisaria usar um PID mais baixo para ter sucesso.
Também existe o potencial de vulnerabilidades de segurança usando notificações do kernel e bifurcando-se para evitar a detecção por uma verificação da tabela de processos; isso, se feito corretamente, resulta em seu processo com um PID mais baixo e as ferramentas de processo não veem o processo em questão.
http://cve.circl.lu/cve/CVE-2018-1121