Vor allem ein bisschen Terminologie .
Eine ausführbare Datei ist eine einfache Datei in Ihrem System. Ein Prozess ist die Nussschale, die das Programm ausführt, das in eine ausführbare Datei eingebettet ist.
Sie haben Recht, wie eine ausführbare Datei gestartet wird :
- Der übergeordnete Prozess (der bereits lebt) ist
fork
selbst und führt von diesem Punkt aus zu zwei Ausführungsflüssen. Einer, der im Elternprozess lebt und einer, der in einem frischen neuen Prozess lebt. - Der neue (untergeordnete) Prozess schaltet sich stumm, um das Programm der ausführbaren Datei auszuführen. Dies geschieht mit einem Syscall der
exec
Familie.
Am Beispiel einer grafischen Benutzeroberfläche, auf die Sie ein Symbol für eine ausführbare Datei doppelklicken, wird die ausführbare Datei von dem Prozess verzweigt, der das von Ihnen angeklickte Symbol mit im Wesentlichen diesem Quellcode zeigt:
const char *exe_path = taken_from_icon(); int pid = fork(); if(pid == 0) { // I am the new child execl(exe_path, exe_path, NULL); // exec only return in case of failure exit(EXIT_FAILURE); } // I am the graphical interface, // Continue and wait for another clic
Aber der Tod und die Elternschaft des Kindes ist nicht genau so, wie Sie sagen.
Grundsätzlich - und wenn der übergeordnete Prozess noch am Leben ist - ist der untergeordnete Prozess das Kind seines Vaters (ja! -). Seine PPID (übergeordnete Prozess-ID) ist auf den noch aktiven Prozess gesetzt, der ihn verzahnt hat.
Dinge ändern sich, wenn der übergeordnete Prozess stirbt. Der untergeordnete Prozess läuft weiter, aber seine PPID ist auf einen noch aktiven übergeordneten Prozess eingestellt. Es gibt immer einen, da der init
Prozess niemals stirbt.
Die Tatsache, dass Schalenkinder sterben, wenn die Schale selbst stirbt, ist etwas Besonderes. Ich sehe zwei Gründe dafür:
Die erste: Eine Shell führt normalerweise eine Liste der PIDs, die sie gegabelt hat. Und wenn die Schale stirbt, tötet sie sie alle. Große Muscheln haben einen
disown
integrierten Befehl, um ein Kind aus dieser Liste zu entfernen und es nach dem Tod der Muschel leben zu lassen. Siehe bash-Manpage :Die Shell wird standardmäßig nach Erhalt eines SIGHUPs beendet. Vor dem Beenden sendet eine interaktive Shell den SIGHUP erneut an alle laufenden oder gestoppten Jobs. Angehaltene Jobs werden an SIGCONT gesendet, um sicherzustellen, dass sie den SIGHUP erhalten. Um zu verhindern, dass die Shell das Signal an einen bestimmten Job sendet, sollte es mit dem eingebauten disown-Befehl aus der Jobtabelle entfernt werden (siehe SHELL BUILTIN COMMANDS unten) oder mit dem Befehl disown -h gekennzeichnet werden, um SIGHUP nicht zu empfangen.
Die zweite: Muschelkinder haben normalerweise stdin, stdout und stderr über Pipes mit der Schale selbst verbunden. Wenn die Shell aufhört, Child stdout zu verbrauchen (häufig um sie zu drucken), oder das Pipe-Ende geschlossen wird, kann das Kind Fehler beim Schreiben in sein stdout haben, was es blockieren oder töten kann.