J'ai essayé d'étudier le processus avec Python
Aperçu
- Un mémo qui a réappris la génération de processus à l'aide de python
--Il y a aussi un module de sous-processus, mais un mémo que j'ai implémenté et ré-étudié moi-même
--Mémorandum
supposition
--Environnement
- python: v.3.7.7
Basiques
os.fork()
--Fork vous permet de copier le processus.
- Le dupliqué est "l'enfant", et celui qui l'a fait est le "parent"
- Le processus enfant renvoie «0» et le processus parent renvoie «id» du processus enfant.
- Les processus fermés n'attendent pas que le processus parent termine le traitement
- Notez que si le processus parent se termine en premier, il restera comme un processus zombie même si ʻos._exit () ʻest utilisé dans le processus enfant.
--En d'autres termes
--Fork branchera le processus à ce stade
- ** Les parents n'attendent pas la fin de leurs enfants **
- Lors du branchement, la valeur de retour de fork () est «0» ou «! 0» pour juger si vous êtes un enfant ou un parent.
--En standard, écrivez s'il faut attendre le traitement du processus enfant (waitpid, etc.) comme traitement du côté du processus parent, laissez-le patienter ou tuez-le.
- S'il est laissé sans surveillance, il peut rester comme un zombie même après la fin du processus enfant.
os._exit()
--End le processus fils créé par fork ()
os.exec()
--Exécuter une commande externe
L'argument de --ʻExec change en fonction de la combinaison des exemples suivants --
v: Spécifiez l'argument du programme à exécuter par tuple ou liste --Exemple) ʻexecvp ('python', ['python', 'test.py'])
--l
spécifie une chaîne de caractères
--Exemple) ʻexeclp ('python', 'python', 'test.py') --
p: Trouvez le programme à exécuter à partir du chemin système (ʻie. PATH
)
--ʻE: Le dictionnaire des variables d'environnement spécifié lors de l'exécution peut être spécifié comme dernier argument. Si spécifié, la variable d'environnement (= variable d'environnement définie par défaut dans le PC) que le programme qui a appelé cette fonction avait ne sera pas héritée, donc si vous voulez l'ajouter, ajoutez-la à la variable d'environnement acquise par ʻos.environ
. Passer des choses
os.waitpid(sid, option)
--Attendez que le traitement de l'ID de processus spécifié par ʻoption = 0` soit terminé
- Si vous ne mordez pas ceci, le processus continuera à rester comme un zombie même si ʻos._exec () ʻest un processus fils. Autrement dit, lorsqu'un processus enfant essaie de se terminer, il reste dans un état zombie à moins que le processus parent n'attende.
--Si ʻoption = os.WNOHANG`, l'état du processus enfant est déterminé. À ce stade, le processus appelant n'est pas bloqué (= n'attend pas), il ne continue donc pas à attendre la fin du processus enfant **.
- Devenir le leader du groupe de processus = Avoir un terminal de contrôle
--Flow jusqu'à ce que vous ayez un terminal de contrôle
- Créez une nouvelle session.
- Faites du processus d'appel le leader d'une nouvelle session.
- Détachez le processus du terminal de commande.
- memo:
―― Que se passe-t-il si le parent
waitpid
après le premier processus enfant _exit
? L'enfant n'est-il pas «tuer» d'abord et devenir un zombie?
- En faisant correctement
waitpid
, le processus fils était kill
. Au contraire, même si l'enfant termine le processus en premier, il deviendra un zombie à moins qu'il ne soit waitpid
.
application
--Dans django, un exemple d'implémentation lorsque vous souhaitez exécuter le processus en tant que travail de longue durée même après avoir renvoyé la requête
- double fork
--Expérience
--Une fois que fork`` runscript
-> Le parent n'attend pas`` return→ Naturellement, le processus enfant devient zombie --Si vous
forkezdeux fois, le processus petit-enfant devient un processus enfant sous init → Le processus petit-enfant se termine → *** Il disparaît sans devenir un zombie *** --Kimo a fait du processus petit-enfant un démon car
setsid ()` fonctionne.
- Le processus fils devient le chef de session après «fork» et a le terminal de contrôle séparément du processus parent.
- Processus enfants Processus petits-enfants «fork»
- Le processus enfant a immédiatement ʻexit ()
et le processus parent attend avec
waitpid → Empêchez le processus enfant de devenir un zombie avec
kill`
- Il est évident que le processus petit-enfant n'est pas un chef de session, il est donc promis de ne pas avoir de terminal de contrôle comme démon
- À la fin du processus enfant, le processus petit-enfant post-traitera le processus sous le processus init (racine), de sorte qu'il ne deviendra pas un zombie après la fin du processus.
- À propos des sessions et des processus
- Tous les processus appartiennent au groupe qui appartient à la session et il existe une hiérarchie.
--Session (SID) → Groupe de processus (PGID) → Process (PID)
- Le premier processus d'un groupe de processus devient le chef de groupe de processus
- Le premier processus d'une session devient le chef de session
- Chaque session est associée à un TTY et seul le chef de session peut contrôler le TTY.
- Pour qu'un processus soit démonisé (exécuté en arrière-plan), le chef de session doit être «kill» pour empêcher la session de contrôler TTY.