In der am höchsten bewerteten Antwort auf die Frage:
Wenn Computer bei 0 mit dem Zählen beginnen, warum hat der Init-Prozess dann eine PID von 1?
Es wurde festgestellt, dass jeder Prozess eine PPID (übergeordnet) hat.
Ich habe jedoch gelesen (der Link wird später bereitgestellt), dass es viele Prozesse gibt, die keine Eltern haben.
Kann irgendjemand die widersprüchlichen Aussagen in einen sinnvollen Kontext bringen?
Antwort1
Prozesse haben immer einen übergeordneten Prozess. Welcher Prozess jedoch der neue übergeordnete Prozess wird, wenn ein bestehender Prozess beendet wird, ist nicht unbedingt PID 1.So macht es 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;
}
Antwort2
Wenn der übergeordnete Prozess eines Prozesses stirbt, kann man sagen, dass der Prozess „kein übergeordnetes Objekt“ hat. Wenn dies geschieht, PPID
wird die PID von auf 1 gesetzt init
.
Jeder Prozess gibt $STATUS
beim Beenden einen Wert zurück. Der übergeordnete Prozess kann mit diesem Wert etwas anfangen, MUSS aber free
im Speicher $STATUS
gespeichert werden und die Prozessdaten im Kernel freigeben.