In den ersten beiden Kapiteln haben wir gelernt, wie man Prozesse unter Linux erstellt.
Unter Linux gibt es drei Möglichkeiten, einen Prozess normal zu beenden, und zwei Möglichkeiten, ihn abnormal zu beenden:
1. Normales Ende:
a. Rufen Sie return in der Hauptfunktion auf. Dies entspricht dem Aufruf von „exit“.
b. Gemäß der Definition dieser Funktion in ANSIC werden beim Aufruf alle registrierten Exit-Handles ausgeführt, alle Standard-E/A-Streams deaktiviert und Dateideskriptoren und mehrere Prozesse (übergeordnete Prozesse) ausgeführt. werden nicht verarbeitet (mit untergeordneten Prozessen), Jobs usw., daher ist es für Linux-Systeme nicht sinnvoll.
c. Rufen Sie die _exit-Funktion auf. Exit wird von _exit als Linux-Training bezeichnet und schließt einige Linux-spezifische Exit-Handles.
2. Ungewöhnliche Beendigung
a. Anruf abbrechen. Dies scheint ein Sonderfall des zweiten Falles zu sein, da er ein SIGABRT-Signal bildet.
b. Der Prozess empfängt ein bestimmtes Signal. Dieses Signal kann vom Prozess selbst generiert werden (z. B. von der Abbruchfunktion) oder von anderen Prozessen oder dem Kernel stammen. Beispiel: Wenn ein Prozess versucht, auf eine Speicheradresse außerhalb der zulässigen Grenzen zuzugreifen, oder wenn der Divisor Null ist, generiert der Kernel ein Signal, um den Prozess zu unterbrechen.
Unabhängig davon, welche Methode zum Beenden des Prozesses verwendet wird, wird letztendlich derselbe Codeabschnitt im Kernel ausgeführt. Dieser Code schließt alle vom Prozess geöffneten Dateideskriptoren, den durch privaten Zugriff belegten Videospeicher usw.
Werfen wir einen Blick auf die Exit- und _exit-Funktionen
Diese beiden Funktionen befinden sich in unterschiedlichen Header-Dateien: Exit befindet sich in stdlib.h, _exit befindet sich in unistd.h
Ihre spezifischen Aufrufmethoden sind wie folgt:
voidexit(int__status)
void_exit(int__status)
Der Statusparameter ist der Exit-Status.
Werfen wir einen Blick auf die folgenden zwei Codeteile:
Bild 1
Bild 2
Bild 3
Bild 4
Dem Code in Abbildung 1 fehlt n, was dazu führt, dass der Satz am Ende des Tests nicht kopiert wird. Dies liegt daran, dass die Informationen nicht sofort kopiert werden, wenn printf n hinzufügt, und _exit die Ausgabe von nicht erzwingt Daten im Puffer, das heißt, die Daten, die nicht auf das Gerät geschrieben wurden und sich noch im Puffer befinden, werden durch Aufrufe wie printf/fprintf verworfen. Die Kopierinformationen gehen beim _exit verloren, jedoch nicht beim Beenden . Wenn es n gibt, kopieren Sie es direkt. Zu diesem Zeitpunkt gibt es keinen Unterschied zwischen exit/_exit
Die unterschiedliche Reihenfolge, in der die Bruder- und Schwesterprozesse beendet werden, führt zu unterschiedlichen Ergebnissen
1. Der übergeordnete Prozess endet vor dem untergeordneten Prozess:
Diese Situation nennen wir einen Waisenprozess. Wenn der übergeordnete Prozess zuerst beendet wird, lässt das System den init-Prozess den untergeordneten Prozess übernehmen.
2. Der untergeordnete Prozess wird vor dem übergeordneten Prozess beendet und der übergeordnete Prozess ruft die Wartefunktion nicht auf
In diesem Fall geht der Unterprozess in einen Zombie-Zustand über und bleibt dieser, bis das System neu gestartet wird. Wenn sich der untergeordnete Prozess in einem Zombie-Zustand befindet, wird er unter Linux ohne Speichern beendet. Der Kernel speichert nur einige notwendige Informationen des Prozesses für den übergeordneten Prozess. Zu diesem Zeitpunkt belegt der untergeordnete Prozess immer noch Ressourcen und reduziert außerdem die maximale Anzahl von Prozessen, die das System erstellen kann.Was sind die Zombie-Staaten?
Ein Prozess, der vor langer Zeit beendet wurde, dessen übergeordneter Prozess sich jedoch noch nicht mit den Nachwirkungen befasst hat (Informationen über den beendeten untergeordneten Prozess erhalten und die von ihm noch belegten Ressourcen freigeben), wird als Zombie-Prozess (Zombie) bezeichnet.3. Der untergeordnete Prozess wird vor dem übergeordneten Prozess beendet. Er wird ohne Speichern unter Linux beendet, aber der übergeordnete Prozess ruft die Wartefunktion auf
Zu diesem Zeitpunkt wartet der übergeordnete Prozess auf das Ende des untergeordneten Prozesses.
Das obige ist der detaillierte Inhalt vonSo beenden Sie einen Prozess unter Linux: Detaillierte Erläuterung der normalen und abnormalen Beendigung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!