Zombie n'est pas vraiment lié aux autres; il s'agit simplement d'un processus qui s'est terminé, mais son processus parent n'a pas encore lu son état de sortie avec waitpid()
ou similaire. Vous ne devriez pas les voir sauf si un processus est bogué ou arrêté.
Un démon est un programme qui s'exécute sans terminal de contrôle. En règle générale, lorsque vous exécutez le programme, lui- fork()s
même et le parent se ferme de sorte que le shell pense que la commande est terminée et que le processus enfant se détache du terminal et échappe à la session de connexion. Depuis la fin de son processus parent, son ID de processus parent devient 1, qui est traditionnellement le init
programme, ou de nos jours systemd
,. Ce processus garantit de récolter ses enfants à leur mort afin de ne pas vous retrouver envahi par des zombies.
Un processus peut être associé à un terminal de contrôle , où il obtient normalement son entrée et envoie sa sortie. Le terminal peut également envoyer des signaux aux processus qui lui sont attachés et identifie un groupe de processus comme groupe de premier plan . Les processus qui sont dans le groupe de premier plan sont autorisés à lire l'entrée du terminal et sont envoyés des signaux SIGINT et SIGSUSP lorsque vous appuyez sur Ctrl-C et Ctrl-Z. Tout processus ne faisant pas partie du groupe de premier plan qui tente de lire à partir du terminal est suspendu avec SIGTSTP.
Le shell crée différents groupes de processus pour chacune des commandes de pipeline que vous lui demandez d'exécuter, et décale celui qui est le groupe de premier plan pour déplacer les travaux entre le premier plan et l'arrière-plan. Lorsque vous exécutez une commande, le shell crée normalement un nouveau groupe de processus et fait de ce groupe le groupe de premier plan . Si vous le suffixez avec un, &
le shell laisse simplement le groupe de premier plan où il était et le nouveau groupe est donc en arrière-plan. En appuyant sur Ctrl-Z, SIGSUSP est envoyé au groupe de premier plan, ce qui entraîne la suspension de la plupart des commandes, mais au lieu de le suspendre, le shell modifie le groupe de premier plan actif pour qu'il puisse vous demander une nouvelle commande.
La bg
commande envoie SIGCONT à un groupe de processus afin qu'il puisse reprendre son exécution en arrière-plan après avoir été suspendu avec SIGSUSP. fg
remplace le groupe de premier plan par l'un des groupes existants qui s'exécutent déjà en arrière-plan, le plaçant au premier plan.
fork()
désactiver une copie de vous-même, utilisez-laexec()
dans cette copie pour le remplacer par ce que vous voulez exécuter, et utiliserwait()
dans l'instance d'origine du programme (pas la copie qui s'est exécutéeexec()
). Dans la très, très courte période de temps entre le moment où l'enfant quitte et le moment où leswait()
moissonneurs sortent de l'état (en le supprimant de la table de processus et en le renvoyant à l'appelant), vous avez un zombie.