質問に対する最も高いランクの回答は次のとおりです。
コンピュータが 0 からカウントを開始する場合、init プロセスの pid が 1 になるのはなぜですか?
各プロセスには PPID (親) があることが述べられています。
しかし、親を持たないプロセスがたくさんあることを読みました (後でリンクを提供します)。
誰か、この矛盾した発言を合理的な文脈に当てはめることができるでしょうか?
答え1
プロセスには常に親プロセスがあります。ただし、既存のプロセスが終了したときに新しい親になるプロセスは、必ずしも PID 1 であるとは限りません。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;
}
答え2
プロセスの親が死ぬと、そのプロセスには「親がない」と言えます。この場合、PPID
は の PID である 1 に設定されますinit
。
すべてのプロセスは$STATUS
終了時に値を返します。親はこの値を使用して何かを行うことができますが、free
メモリ$STATUS
に格納されている値を使用し、カーネル内のプロセス データを解放する必要があります。