Prozessbeendigung ist eine übliche Operation in Linux-Systemen. Sie ermöglicht es einem Prozess, seine eigene Operation zu beenden, die von ihm belegten Ressourcen freizugeben und in seinen eigenen Zustand zurückzukehren. Es gibt viele Gründe für das Beenden eines Prozesses, z. B. das normale Erledigen von Aufgaben, das Auftreten von Fehlern, das Empfangen von Signalen usw. Es gibt viele Möglichkeiten, einen Prozess zu beenden, z. B. die Verwendung von exit(), return, _exit(), abort() und anderen Funktionen oder Anweisungen. Aber wissen Sie wirklich, wie man einen Linux-Prozess beendet? Wissen Sie, wie Sie unter Linux die geeignete Prozess-Exit-Methode verwenden und auswählen? Wissen Sie, wie man einen Prozess unter Linux ordnungsgemäß beendet? In diesem Artikel werden Ihnen die relevanten Kenntnisse zum Beenden von Linux-Prozessen im Detail vermittelt, damit Sie diesen allgemeinen Vorgang unter Linux besser nutzen und verstehen können.
Das Beenden eines Prozesses unter Linux wird in zwei Arten unterteilt: normales Beenden und abnormales Beenden:
1.Normalerweise beenden
a. Return in der Funktion main() ausführen.
b. Rufen Sie die Funktion „exit()“ auf
c. Rufen Sie die Funktion _exit() auf2.Unnormal beenden
a. Rufen Sie wegen der Funktion an
b. Der Prozess empfängt ein Signal und das Signal bewirkt, dass das Programm beendet wird.
Unabhängig davon, welche Exit-Methode verwendet wird, führt das System letztendlich denselben Code im Kernel aus. Dieser Code wird verwendet, um den vom Prozess verwendeten offenen Dateideskriptor zu schließen und den von ihm belegten Speicher und andere Ressourcen freizugeben.
exit ist eine Funktion mit Parametern. Nachdem der Exit ausgeführt wurde, wird die Kontrolle an das System übergeben
return ist die Rückkehr nach Ausführung der Funktion. Nachdem renturn ausgeführt wurde, wird die Kontrolle an die aufrufende Funktion übergeben.
2. Der Unterschied zwischen Exit und Abbruch:
exit ist die normale Beendigung des Prozesses
about ist eine abnormale Beendigung.
exit wird in der Header-Datei stdlib.h deklariert, während _exit() in der Header-Datei unistd.h deklariert wird. Der Parameter „exit_code“ in „exit“ ist 0, was bedeutet, dass der Prozess normal beendet wird. Wenn es sich um einen anderen Wert handelt, bedeutet dies, dass während der Programmausführung ein Fehler auftritt.
Wenn die _exit-Funktion aufgerufen wird, werden alle Dateideskriptoren des Prozesses geschlossen, der Speicher bereinigt und einige andere Kernel-Reinigungsfunktionen ausgeführt, der Stream wird jedoch nicht aktualisiert (stdin, stdout, stderr ...). über der _exit-Funktion Ein Wrapper, der _exit aufruft und den Stream leert, bevor er ihn aufruft.
Der größte Unterschied zwischen der Funktion „exit()“ und der Funktion „_exit()“ besteht darin, dass die Funktion „exit()“ den Öffnungsstatus der Datei prüft und den Inhalt des Dateipuffers zurück in die Datei schreibt, bevor sie das Exit-System aufruft. Da es in der Linux-Standardfunktionsbibliothek eine Operation namens „gepufferte E/A“ gibt, besteht ihr Merkmal darin, dass im Speicher für jede geöffnete Datei ein Puffer vorhanden ist. Jedes Mal, wenn eine Datei gelesen wird, werden mehrere Datensätze kontinuierlich gelesen, sodass die Datei beim nächsten Lesen direkt aus dem Speicherpuffer gelesen werden kann. Ebenso wird bei jedem Schreiben einer Datei nur in den Speicher geschrieben Wenn bestimmte Bedingungen erfüllt sind (z. B. das Erreichen einer bestimmten Anzahl oder das Vorkommen bestimmter Zeichen usw.), wird der Inhalt des Puffers sofort in die Datei geschrieben. Diese Technologie erhöht die Geschwindigkeit beim Lesen und Schreiben von Dateien erheblich, bringt aber auch ein wenig Probleme beim Programmieren mit sich. Es wird beispielsweise angenommen, dass einige Daten in die Datei geschrieben wurden. Da sie bestimmte Bedingungen nicht erfüllen, werden sie zu diesem Zeitpunkt nur im Puffer gespeichert. Verwenden Sie zum direkten Schließen die Funktion _exit() Der Vorgang wird unterbrochen und die Daten im Puffer gehen verloren. Wenn Sie daher die Integrität der Daten sicherstellen möchten, müssen Sie die Funktion exit() verwenden.
Sehen wir uns den Unterschied zwischen ihnen anhand eines Funktionsbeispiels an:
Funktionsbeispiel 1: exit.c
#include #include int main() { printf("using exit----\n"); printf("This is the content in buffer\n"); exit(0); }
Das Ausführungsergebnis ist:
using exit---- This is the content in buffer
Funktionsbeispiel 2: _exit.c
#include #include int main() { printf("using _exit--\n"); printf("This is the content in buffer"); _exit(0); }
Das Ausführungsergebnis ist:
using _exit--
Die printf-Funktion verwendet gepufferte E/A. Diese Funktion liest den Datensatz automatisch aus dem Puffer, wenn sie auf das Zeilenumbruchzeichen „n“ trifft. Daher wird exit() beendet, nachdem die Daten in den Puffer geschrieben wurden, während die Funktion _exit() direkt beendet wird.
Sie können printf("Dies ist der Inhalt im Puffer"); in Funktionsinstanz 2 auch in printf("Dies ist der Inhalt im Puffer") ändern (das heißt, am Ende von printf ein n hinzufügen, um das Ergebnis zu sehen ist. Warum passiert das?
Diese Situation ist der Waisenprozess, den wir zuvor verwendet haben. 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 wechselt der untergeordnete Prozess in einen Zombie-Zustand und bleibt dieser, bis das System neu gestartet wird. Wenn sich der untergeordnete Prozess in einem Zombie-Zustand befindet, speichert der Kernel nur einige notwendige Informationen über den Prozess, die der übergeordnete Prozess benötigt. Zu diesem Zeitpunkt belegt der untergeordnete Prozess immer Ressourcen und reduziert außerdem die maximale Anzahl von Prozessen, die das System erstellen kann.
Wie ist der Zustand der Zombies?
Ein Prozess, der beendet wurde, dessen übergeordneter Prozess sich jedoch noch nicht mit den Folgen befasst hat (Informationen über den beendeten untergeordneten Prozess erhalten und die von ihm noch belegten Ressourcen freigeben), wird als Zombie-Prozess bezeichnet.
3. Der untergeordnete Prozess wird vor dem übergeordneten Prozess beendet und der übergeordnete Prozess ruft die Wartefunktion auf
Zu diesem Zeitpunkt wartet der übergeordnete Prozess auf das Ende des untergeordneten Prozesses.Durch diesen Artikel sollten Sie ein umfassendes Verständnis der Linux-Prozess-Exit-Methoden haben und deren Definition, Prinzipien, Verwendung sowie Vor- und Nachteile kennen. Sie sollten auch die Ursachen und Auswirkungen des Prozessabbruchs verstehen und wissen, wie Sie Prozessabbruchmethoden unter Linux richtig verwenden und auswählen. Wir empfehlen, dass Sie bei Verwendung eines Linux-Systems geeignete Prozessexitmethoden verwenden, um den Prozess zu beenden und so die Stabilität und Effizienz des Systems zu verbessern. Gleichzeitig erinnern wir Sie auch daran, bei der Verwendung der Prozess-Exit-Methode auf einige potenzielle Probleme und Herausforderungen zu achten, wie z. B. Zombie-Prozesse, Speicherverluste, Signalverarbeitung usw. Ich hoffe, dieser Artikel kann Ihnen dabei helfen, das Linux-System besser zu nutzen und den Prozess unter Linux ordnungsgemäß zu beenden.
Das obige ist der detaillierte Inhalt vonMethoden und Techniken zum Beenden eines Linux-Prozesses: So beenden Sie den Prozess ordnungsgemäß. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!