Wer fragt sich, wenn die Anwendungen unter Linux doppelt angeklickt werden?

380
Anurag

Ich weiß also, wenn in der Shell eine ausführbare Datei ausgeführt wird, fügt sie diese dann in einen untergeordneten Prozess und später in die Ausführung ein, um das Programm und den Datenspeicher meiner ausführbaren Datei abzurufen. Wenn also meine Shell nun geschlossen / beendet wird, werden auch alle zugehörigen untergeordneten Prozesse beendet.

Ich habe gelesen, dass in Linux jeder Prozess über Fork () exec () erstellt wird. Ich bin neugierig und habe mich gefragt, wann immer eine Anwendung durch Doppelklicken auf das entsprechende Symbol gestartet wird. Welcher Prozess forks () exec () ist. Ich verstehe, dass es sich um einen OS-Prozess handelt. Ich habe mich gefragt, welcher

Vielen Dank!

Antwort verfolgt nach / sbin / upstart

1
Ich würde mich über einen Grund für die Ablehnung freuen. Dies ist eine echte Frage, deren Antwort ich online nicht finden konnte Anurag vor 7 Jahren 0
Ich habe nicht gewählt, aber ich kann Ihnen sagen, dass es mir unmöglich ist, Ihre Frage in der aktuellen Form zu verfolgen. Vielleicht sehen es andere auch so. Ich habe keine Ahnung, was Sie fragen. Brick vor 7 Jahren 0
@Brick danke! Ich habe an diesem Punkt vielleicht nur halbes Wissen und daher die Unvollständigkeit in der Frage. Ich habe gelesen, dass in Linux jeder Prozess über Fork () exec () erstellt wird. Ich habe mich gefragt, wann immer eine Anwendung durch Doppelklicken auf das entsprechende Symbol gestartet wird. Welcher Prozess wird forks () exec () ausgeführt? Ich verstehe, dass es sich um einen OS-Prozess handelt. Ich frage mich, welcher Anurag vor 7 Jahren 0
Geben Sie "ps -fu" ein in der Befehlszeile. Die Spalte PID ist der Bezeichner für den Prozess in jeder Zeile. Die Spalte PPID gibt die Nummer des übergeordneten Prozesses an. Brick vor 7 Jahren 0
@Brick Ich habe nicht darüber nachgedacht! Vielen Dank! Traced es zu / sbin / upstart, was der Ersatz für init ist Anurag vor 7 Jahren 1
Wenn diese Antwort zufriedenstellend ist, können Sie Ihre eigene Frage beantworten und akzeptieren. Was das Töten aller Kinder betrifft, wenn das Elternteil stirbt, ist dies nicht ganz richtig. Es ist möglich, Zombie- und verwaiste Prozesse in einem System zu haben. Obwohl sie (optimal) selten sein sollten. Siehe auch [this] (http://linuxg.net/what-are-zombie-and-orphan-prozesse-and-how-to-kill-them/). Seth vor 7 Jahren 0
Ja, das ist absolut nicht der Beginn Ihrer Anwendungen. Daniel B vor 7 Jahren 0
@Seth Ich habe gerade auch darüber gelesen. Danke! Anurag vor 7 Jahren 0
@DanielB wenn ich falsch liege, kannst du mich bitte anweisen? Anurag vor 7 Jahren 0
In der Regel handelt es sich dabei um die Shell Ihrer Desktop-Umgebung oder um ein Symbol für die Symbole, auf die Sie doppelklicken. Versuchen Sie "htop", es bietet eine Baumansicht. Daniel B vor 7 Jahren 0

1 Antwort auf die Frage

0
A. Loiseau

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 :

  1. Der übergeordnete Prozess (der bereits lebt) ist forkselbst 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.
  2. Der neue (untergeordnete) Prozess schaltet sich stumm, um das Programm der ausführbaren Datei auszuführen. Dies geschieht mit einem Syscall der execFamilie.

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 initProzess 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 disownintegrierten 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.