¿Existen procesos que no tienen padre?

¿Existen procesos que no tienen padre?

En la respuesta a la pregunta mejor clasificada:

Si las computadoras comienzan a contar en 0, ¿por qué el proceso de inicio tiene un pid de 1?

Se afirmó que cada proceso tiene un PPID (padre).

Sin embargo, leí (proporcionaré el enlace más adelante) que hay muchos procesos que no tienen padres.

¿Alguien podría poner las declaraciones contradictorias en un contexto razonable?

Respuesta1

Los procesos siempre tienen un proceso padre. Sin embargo, el proceso que se convierte en el nuevo padre cuando un proceso existente muere no es necesariamente el PID 1.Así es como lo hace Linux:

/*
 * 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;
}

Respuesta2

Cuando el padre de un proceso muere, se puede decir que el proceso "no tiene padre". Cuando esto sucede, PPIDse establece en 1, el PID de init.

Cada proceso devuelve un $STATUS valor al salir. El padre puede hacer algo con este valor, pero DEBE almacenar freela memoria y liberar los datos del proceso en el kernel.$STATUS

información relacionada