Dans les deux premiers chapitres, nous avons appris à créer des processus. Dans ce chapitre, nous apprendrons comment terminer le processus sous Linux.
Sous Linux, il existe 3 façons de terminer un processus normalement et 2 façons de le terminer anormalement :
1. Fin normale :
a. Retour d'appel dans la fonction principale. Cela équivaut à appeler exit.
b.Appelez la fonction de sortie. Selon la définition de cette fonction dans ANSIC, lorsqu'elle est appelée, tous les handles de sortie enregistrés seront exécutés, tous les flux d'E/S standard seront désactivés, ainsi que les descripteurs de fichiers et plusieurs processus (processus parents). ne sera pas traité. (avec les processus enfants), les tâches, etc., ce n'est donc pas adapté aux systèmes Linux.
c. Appelez la fonction _exit. Exit est appelé formation Linux par _exit et ferme certains handles de sortie spécifiques à Linux.
2. Résiliation anormale
a. Appelez l'abandon. Cela semble être un cas particulier du deuxième cas, puisqu'il forme un signal SIGABRT.
b. Le processus reçoit un signal spécifique. Ce signal peut être généré par le processus lui-même (comme la fonction abort), ou il peut provenir d'autres processus ou du noyau. Par exemple : lorsqu'un processus tente d'accéder à une adresse mémoire hors limites ou lorsque le diviseur est nul, le noyau génère un signal pour interrompre le processus.
Quelle que soit la méthode utilisée pour terminer le processus, le même morceau de code dans le noyau finira par être exécuté. Ce code ferme tous les descripteurs de fichiers ouverts par le processus, la mémoire vidéo occupée par les accès privés, etc.
Jetons un coup d'œil aux fonctions exit et _exit
Ces deux fonctions sont dans des fichiers d'en-tête différents : exit est dans stdlib.h, _exit est dans unistd.h
Leurs méthodes d'appel spécifiques sont les suivantes :
voidexit(int__status)
void_exit(int__status)
Le paramètre status est le statut de sortie.
Jetons un coup d'œil aux deux morceaux de code suivants :
Photo 1
Photo 2
Photo 3
Image 4
Le code de la figure 1 manque de n, ce qui fait que la phrase à la fin du test n'est pas copiée. En effet, si printf n'ajoute pas de n, les informations ne seront pas copiées immédiatement et _exit ne forcera pas la sortie du fichier. les données dans le tampon. c'est-à-dire que les données qui n'ont pas été écrites sur le périphérique et qui sont toujours dans le tampon provoquées par des appels tels que printf/fprintf seront supprimées lors de _exit, mais pas avec exit. . S'il y a n, copiez-le directement. Pour le moment, il n'y a aucune différence entre exit/_exit
.L'ordre différent dans lequel les processus frère et sœur sont terminés produira des résultats différents
1. Le processus parent se termine avant le processus enfant :
Cette situation est ce que nous appelons un processus orphelin. Lorsque le processus parent se termine en premier, le système laisse le processus d'initialisation prendre le relais du processus enfant.
2. Le processus enfant se termine avant le processus parent, et le processus parent n'appelle pas la fonction d'attente
Dans ce cas, le sous-processus entre dans un état zombie et le restera jusqu'au redémarrage du système. Lorsque le processus enfant est dans un état zombie Sous Linux, il se termine sans enregistrer Le noyau enregistre uniquement certaines informations nécessaires du processus pour le processus parent. À ce stade, le processus enfant occupe toujours des ressources et réduit également le nombre maximum de processus pouvant être créés par le système.
Quels sont les états zombies ?
Un processus qui a été terminé il y a longtemps, mais dont le processus parent n'a pas encore traité les conséquences (obtenir des informations sur le processus enfant terminé et libérer les ressources qu'il occupe encore) est appelé un processus zombie (zombie).
3. Le processus enfant se termine avant le processus parentQuitte sans enregistrer sous Linux, mais le processus parent appelle la fonction d'attente
À ce stade, le processus parent attendra la fin du processus enfant.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!