[GO] Ich habe versucht, den Prozess mit Python zu studieren
Überblick
- Ein Memo, das die Prozessgenerierung mit Python neu lernte
- Es gibt auch ein Unterprozessmodul, aber ein Memo, das ich selbst implementiert und neu studiert habe
--Memorandum
Annahme
--Umgebung
- python: v.3.7.7
Grundlagen
os.fork()
- Mit Fork können Sie den Vorgang kopieren.
- Das Duplizierte ist das "Kind", und derjenige, der es gemacht hat, ist das "Elternteil".
- Der untergeordnete Prozess gibt "0" zurück, und der übergeordnete Prozess gibt die untergeordnete Prozess-ID zurück.
- Gefälschte Prozesse warten nicht darauf, dass der übergeordnete Prozess die Verarbeitung beendet
- Beachten Sie, dass der übergeordnete Prozess, wenn er zuerst beendet wird, auch dann als Zombie-Prozess verbleibt, wenn er im untergeordneten Prozess "os._exit ()" ist.
--Mit anderen Worten
--Fork verzweigt den Prozess an diesem Punkt
- ** Eltern warten nicht auf das Ende ihrer Kinder **
- Beim Verzweigen ist der Rückgabewert von fork () "0" oder "! 0", um zu beurteilen, ob Sie ein Kind oder ein Elternteil sind.
- Schreiben Sie standardmäßig, ob auf die Verarbeitung des untergeordneten Prozesses (waitpid usw.) als Verarbeitung auf der Seite des übergeordneten Prozesses gewartet werden soll, lassen Sie ihn warten oder beenden Sie ihn.
- Wenn es unbeaufsichtigt bleibt, kann es auch nach dem Ende des untergeordneten Prozesses als Zombie bleiben.
os._exit()
- Beenden Sie den untergeordneten Prozess, der mit fork () erstellt wurde.
os.exec()
- Führen Sie einen externen Befehl aus
- Das Argument von
exec
ändert sich abhängig von der Kombination der folgenden Beispiele.
--v
: Geben Sie das Argument des Programms an, das per Tupel oder Liste ausgeführt werden soll
--Beispiel) execvp ('python', ['python', 'test.py'])
--l
gibt eine Zeichenkette an
--Beispiel) execlp ('python', 'python', 'test.py')
--p
: Suchen Sie das auszuführende Programm über den Systempfad (dh PATH
).
--e
: Das zur Laufzeit angegebene Wörterbuch der Umgebungsvariablen kann als letztes Argument angegeben werden. Wenn angegeben, wird die Umgebungsvariable (= auf dem PC standardmäßig festgelegte Umgebungsvariable), über die das Programm, das diese Funktion aufgerufen hat, verfügt, nicht vererbt. Wenn Sie sie also hinzufügen möchten, fügen Sie sie der von os.environ
erfassten Umgebungsvariablen hinzu. Dinge weitergeben
os.waitpid(sid, option)
--Warten Sie, bis die Verarbeitung der durch option = 0
angegebenen Prozess-ID abgeschlossen ist
- Wenn Sie dies nicht beißen, bleibt der Prozess weiterhin ein Zombie, auch wenn es sich in einem untergeordneten Prozess um "os._exec ()" handelt. Das heißt, wenn ein untergeordneter Prozess versucht, zu beenden, bleibt er in einem Zombie-Zustand, es sei denn, der übergeordnete Prozess wartet.
--Wenn
option = os.WNOHANG
, wird der Status des untergeordneten Prozesses beurteilt. Zu diesem Zeitpunkt ist der aufrufende Prozess nicht blockiert (= wartet nicht), sodass er nicht auf die Beendigung des untergeordneten Prozesses wartet **.
- Werden Sie Leiter der Prozessgruppe = Haben Sie ein Kontrollterminal
- Fließen Sie, bis Sie ein Steuerterminal haben
- Erstellen Sie eine neue Sitzung.
- Machen Sie den Anrufprozess zum Leiter einer neuen Sitzung.
- Trennen Sie den Prozess vom Steuerterminal.
- memo:
――Was passiert, wenn der Elternteil nach dem untergeordneten Prozess zuerst "_pit" wartet? Tötet das Kind nicht zuerst und wird ein Zombie?
- Indem Sie "waitpid" richtig gemacht haben, war der untergeordnete Prozess "kill". Im Gegenteil, selbst wenn das Kind den Vorgang zuerst beendet, wird es zu einem Zombie, es sei denn, es ist "waitpid".
Anwendung
--In django ein Implementierungsbeispiel, wenn Sie den Prozess auch nach Rückgabe der Anforderung als Langzeitjob ausführen möchten
- double fork
--Experiment
- Einmal
Fork`` Runscript
-> Parent wartet nicht`` Return` → Natürlich wird der untergeordnete Prozess zum Zombie
- Wenn Sie zweimal "gabeln", wird der Enkelprozess unter init → zu einem untergeordneten Prozess. → Der Enkelprozess endet.
- Kimo hat den Enkelprozess zu einem Daemon gemacht, weil
setsid ()
funktioniert.
- Der untergeordnete Prozess wird nach "Fork" zum Sitzungsleiter und hat das Steuerterminal getrennt vom übergeordneten Prozess.
- Untergeordnete Prozesse "Gabel" Enkelprozesse
- Der untergeordnete Prozess sofort "exit ()" und der übergeordnete Prozess wartet mit "waitpid" → verhindern, dass der untergeordnete Prozess mit "kill" zu einem Zombie wird
- Es ist offensichtlich, dass der Enkelprozess kein Sitzungsleiter ist, daher wird versprochen, kein Kontrollterminal als Dämon zu haben.
- Wenn der untergeordnete Prozess endet, verarbeitet der Enkelprozess den Prozess unter dem Init-Prozess (root) nach, sodass er nach dem Ende des Prozesses kein Zombie wird.
- Über Sitzungen und Prozesse
- Alle Prozesse gehören zu der Gruppe, die zur Sitzung gehört, und es gibt eine Hierarchie.
- Sitzung (SID) → Prozessgruppe (PGID) → Prozess (PID)
- Der erste Prozess in einer Prozessgruppe wird zum Prozessgruppenleiter
- Der erste Prozess in einer Sitzung wird zum Sitzungsleiter
- Jeder Sitzung ist ein TTY zugeordnet, und nur der Sitzungsleiter kann das TTY steuern.
- Damit ein Prozess dämonisiert werden kann (im Hintergrund ausgeführt), muss der Sitzungsleiter "kill" sein, um zu verhindern, dass die Sitzung TTY steuert.