Existem processos que não têm pai?

Existem processos que não têm pai?

Na resposta da pergunta com melhor classificação:

Se os computadores começam a contar em 0, por que o processo init tem pid igual a 1?

foi afirmado que cada processo possui um PPID (pai).

No entanto, li (fornecerei o link mais tarde) que existem muitos processos que não têm pais.

Alguém poderia colocar as declarações contraditórias em um contexto razoável?

Responder1

Os processos sempre têm um processo pai. No entanto, qual processo se torna o novo pai quando um processo existente morre não é necessariamente o PID 1.Veja como o Linux faz isso:

/*
 * When we die, we re-parent all our children, and try to:
 * 1. give them to another thread in our thread group, if such a member exists
 * 2. give it to the first ancestor process which prctl'd itself as a
 *    child_subreaper for its children (like a service manager)
 * 3. give it to the init process (PID 1) in our pid namespace
 */
static struct task_struct *find_new_reaper(struct task_struct *father,
                       struct task_struct *child_reaper)
{
    struct task_struct *thread, *reaper;

    thread = find_alive_thread(father);
    if (thread)
        return thread;

    if (father->signal->has_child_subreaper) {
        unsigned int ns_level = task_pid(father)->level;
        /*
         * Find the first ->is_child_subreaper ancestor in our pid_ns.
         * We can't check reaper != child_reaper to ensure we do not
         * cross the namespaces, the exiting parent could be injected
         * by setns() + fork().
         * We check pid->level, this is slightly more efficient than
         * task_active_pid_ns(reaper) != task_active_pid_ns(father).
         */
        for (reaper = father->real_parent;
             task_pid(reaper)->level == ns_level;
             reaper = reaper->real_parent) {
            if (reaper == &init_task)
                break;
            if (!reaper->signal->is_child_subreaper)
                continue;
            thread = find_alive_thread(reaper);
            if (thread)
                return thread;
        }
    }

    return child_reaper;
}

Responder2

Quando o pai de um processo morre, pode-se dizer que o processo "não tem pai". Quando isso acontece, PPIDé definido como 1, o PID de init.

Todo processo retorna um $STATUS valor na saída. O Pai pode fazer algo com este valor, mas DEVE que freea memória $STATUSesteja armazenada e libere os dados do processo no kernel.

informação relacionada