Prozesserzeugung
100%

Prozesse · Lektion 4

Prozesserzeugung

Erfahre, wie fork, exec, PIDs und Elternbeziehungen an der Erzeugung von Linux-Prozessen beteiligt sind.

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.

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:

  1. Die Shell erzeugt einen Kindprozess.
  2. Der Kindprozess bereitet Umleitungen und anderen Ausführungszustand vor.
  3. Der Kindprozess führt das angeforderte Programm aus.
  4. 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?

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
Nächste Lektion
Zurück zu Prozesse