Ich habe immer gelernt, dass der Init-Prozess der Vorfahre aller Prozesse ist. Warum hat Prozess 2 eine PPID von 0?
$ ps -ef | head -n 3
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 May14 ? 00:00:01 /sbin/init
root 2 0 0 May14 ? 00:00:00 [kthreadd]
Akzeptierte Antwort:
Erstens ist „Vorfahre“ nicht dasselbe wie „Elternteil“. Der Vorfahre kann der Elternteil des Elternteils sein … der Elternteil des Elternteils, und der Kernel verfolgt nur eine Ebene.
Wenn jedoch ein Prozess stirbt, werden seine Kinder von init übernommen, sodass Sie viele Prozesse sehen werden, deren Elternteil ist 1 auf einem typischen System.
Moderne Linux-Systeme haben zusätzlich ein paar Prozesse, die Kernel-Code ausführen, aber von der Zeitplanung her als Benutzerprozesse verwaltet werden. (Sie befolgen nicht die üblichen Speicherverwaltungsregeln, da sie Kernel-Code ausführen.) Diese Prozesse werden alle von kthreadd
erzeugt (es ist die Initialisierung von Kernel-Threads). Sie erkennen sie an ihrer übergeordneten Prozess-ID (2) oder normalerweise daran, dass ps
listet sie mit einem Namen in eckigen Klammern auf oder durch die Tatsache, dass /proc/2/exe
(normalerweise ein symbolischer Link zur ausführbaren Datei des Prozesses) kann nicht gelesen werden.
Prozesse 1 (init
) und 2 (kthreadd
) werden beim Booten direkt vom Kernel erstellt, haben also kein übergeordnetes Element. Der Wert 0 wird in ihrem ppid-Feld verwendet, um dies anzuzeigen. Stellen Sie sich 0 hier als „den Kernel selbst“ vor.
Linux hat auch einige Möglichkeiten für den Kernel, Benutzerprozesse zu starten, deren Standort unter bestimmten Umständen über einen sysctl-Parameter angegeben wird. Beispielsweise kann der Kernel Modulladeereignisse auslösen (z. B. wenn neue Hardware entdeckt wird oder wenn einige Netzwerkprotokolle zum ersten Mal verwendet werden), indem er das Programm in kernel.modprobe
aufruft sysctl-Wert. Wenn ein Programm einen Kern ausgibt, ruft der Kernel das durch kernel.core_pattern
angegebene Programm auf falls vorhanden.