Primeiro, "ancestral" não é a mesma coisa que "pai". O ancestral pode ser o pai dos pais, o pai dos pais, e o kernel apenas controla um nível. No entanto, quando um processo morre, seus filhos são adotados pelo init, então você verá muitos processos cujo pai é 1 em um sistema típico.
Os sistemas Linux modernos também possuem alguns processos que executam o código do kernel, mas são gerenciados como processos do usuário, no que se refere ao agendamento. (Eles não obedecem às regras usuais de gerenciamento de memória, já que estão executando o código do kernel.) Esses processos são gerados por kthreadd
(é o init dos encadeamentos do kernel). Você pode reconhecê-los pelo ID de processo pai (2) ou, geralmente, pelo fato de ps
listá-los com um nome entre colchetes ou pelo fato de que /proc/2/exe
(normalmente um link simbólico para o executável do processo) pode seja lido.
Os processos 1 ( init
) e 2 ( kthreadd
) são criados diretamente pelo kernel no momento da inicialização, para que não tenham um pai. O valor 0 é usado em seu campo ppid para indicar isso. Pense em 0 como significando "o próprio kernel" aqui.
O Linux também tem algumas facilidades para o kernel iniciar processos de usuários cuja localização é indicada através de um parâmetro sysctl em certas circunstâncias . Por exemplo, o kernel pode acionar eventos de carregamento do módulo (por exemplo, quando um novo hardware é descoberto ou quando alguns protocolos de rede são usados pela primeira vez) chamando o programa no valor kernel.modprobe
sysctl. Quando um programa despeja o núcleo, o kernel chama o programa indicado por kernel.core_pattern
se houver.