부모가 없는 프로세스가 있나요?

부모가 없는 프로세스가 있나요?

질문에 대한 상위 답변 중:

컴퓨터가 0부터 세기 시작하면 init 프로세스의 pid가 1인 이유는 무엇입니까?

모든 프로세스에는 PPID(부모 프로세스)가 있다고 합니다.

그러나 부모가 없는 프로세스가 많다는 내용을 읽었습니다(링크는 나중에 제공됨).

누구든지 이러한 상충되는 진술을 합리적인 맥락에 넣을 수 있습니까?

답변1

프로세스에는 항상 상위 프로세스가 있습니다. 그러나 기존 프로세스가 종료되면 새 부모가 되는 프로세스가 반드시 PID 1일 필요는 없습니다.리눅스는 이런 일을 한다:

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

답변2

프로세스의 상위 프로세스가 종료되면 해당 프로세스에는 "상위 프로세스가 없습니다"라고 말할 수 있습니다. 이런 일이 발생하면 PPIDPID는 1로 설정됩니다 init.

각 프로세스는 $STATUS 종료될 때 값을 반환합니다. 상위 프로세스는 이 값을 사용하여 작업을 수행할 수 있지만 저장된 free메모리를 저장 $STATUS하고 프로세스 데이터를 커널에 해제해야 합니다.

관련 정보