Linux-Prozesse bilden Eltern-Kind-Beziehungen. Eine Shell startet einen externen Befehl gewöhnlich, indem sie einen Kindprozess erzeugt und dafür sorgt, dass dieser das angeforderte Programm ausführt. Die klassische Erklärung teilt diese Arbeit in die Vorgänge fork und exec auf.
Prozesse · Lektion 4
Prozesserzeugung
Erfahre, wie fork, exec, PIDs und Elternbeziehungen an der Erzeugung von Linux-Prozessen beteiligt sind.
Mit `fork` einen Kindprozess erzeugen
Der Systemaufruf fork() erzeugt anhand des aufrufenden Prozesses einen Kindprozess. Eltern- und Kindprozess setzen ihre Ausführung am Rückkehrpunkt von fork fort, erhalten jedoch unterschiedliche Rückgabewerte und besitzen unterschiedliche PIDs.
Der Kindprozess erhält einen logisch getrennten Prozesszustand. Linux kann physische Speicherseiten zunächst mittels Copy-on-Write gemeinsam verwenden und eine Seite erst kopieren, wenn einer der Prozesse sie ändert. Offene Dateideskriptoren werden vererbt und verweisen auf dieselben zugrunde liegenden Beschreibungen geöffneter Dateien. Einzelheiten wie Dateipositionen können daher gemeinsam bleiben.
Was erzeugt ein erfolgreiches fork()?
Ein Programm mit `execve` ersetzen
Ein Aufruf von execve() lädt ein neues Programm in den aufrufenden Prozess. Bei Erfolg ersetzt er das Prozessabbild und kehrt nicht zum alten Programm zurück. Die PID bleibt unverändert, da execve() keinen neuen Prozess erzeugt.
Viele Shell-Befehle folgen deshalb einem fork-exec-Muster:
- Die Shell erzeugt einen Kindprozess.
- Der Kindprozess bereitet Umleitungen und anderen Ausführungszustand vor.
- Der Kindprozess führt das angeforderte Programm aus.
- Die Shell wartet oder setzt ihre Arbeit fort, abhängig von der Ausführung im Vorder- oder Hintergrund.
Bibliotheken und Anwendungen können übergeordnete Schnittstellen wie posix_spawn() bereitstellen, und Linux besitzt weitere Primitive wie clone(). Das vertraute fork-exec-Modell bleibt nützlich, ist aber nicht die einzig mögliche Schnittstelle.
Was geschieht nach einem erfolgreichen execve() mit der PID eines Prozesses?
Eltern- und Kind-IDs prüfen
PID kennzeichnet den Prozess, während PPID seinen Elternprozess kennzeichnet. Fordere diese Felder ausdrücklich an:
$ ps -o pid,ppid,stat,cmd
Wenn eine Shell ps startet, erscheint die PID der Shell gewöhnlich als PPID dieses ps-Prozesses. Der Zeitpunkt ist wichtig: Kurzlebige Prozesse können sich beenden, bevor eine getrennte Beobachtung sie erfasst.
Wofür steht PPID in einer Prozessauflistung?
PID 1 und neue Elternzuordnung
Der Kernel startet den ersten User-Space-Prozess mit der PID 1. Je nach System kann es sich um systemd, eine andere init-Implementierung oder ein kleines init innerhalb eines Containers oder PID-Namensraums handeln. PID 1 startet und überwacht Teile der User-Space-Umgebung und besitzt besondere Zuständigkeiten für Signale und das Aufräumen verwaister Prozesse.
Wenn sich ein Elternprozess vor seinem Kind beendet, wird der Kindprozess einem geeigneten Subreaper oder dem init-Prozess seines PID-Namensraums als neues Kind zugeordnet. Er muss sich nicht allein deshalb beenden, weil sein ursprünglicher Elternprozess beendet wurde.
Welche Aussage über PID 1 ist richtig?
Im Lab Linux-Prozesse verwalten und überwachen kannst du Eltern- und Kind-IDs beobachten, während du Befehle im Vorder- und Hintergrund ausführst.
Lektion abgeschlossen
Sie haben Prozesserzeugung abgeschlossen
Du kannst nun die klassische Reihenfolge der Linux-Prozesserzeugung nachvollziehen.
Verwende
fork(), um einen Kindprozess mit eigener PID zu erzeugen.Verwende
execve(), um ein Prozessabbild zu ersetzen, ohne seine PID zu ändern.Lies PID und PPID, um Eltern-Kind-Beziehungen zu erkennen.
Erkenne PID 1 und Subreaper als Ziele für Kindprozesse mit neuer Elternzuordnung.
Lernfortschritt speichern
Erstellen Sie ein kostenloses Konto, um diese Lektion zu speichern und auf jedem Gerät weiterzulernen.
Kostenloses Konto erstellen