Topologie des processus
En programmation système, notamment en C sous UNIX/Linux, la topologie des processus fait référence à la manière dont les processus sont organisés et interconnectés.
Topologie en ligne
La topologie en ligne est plutôt logique, on la représente de la manière suivante :
P1 → P2 → P3 → ... → Pn
où Pi avec i un entier positif qui désigne le i-ème processus.
Dans une topologie en ligne chaque processus vas créer un fils.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NB_FILS 4
int main() {
pid_t pid;
for (int i = 0; i < NB_FILS ; i++) {
pid = fork();
if (pid > 0) {
// On se trouve dans le processus père
wait(NULL);
printf("Processus %d terminé, PID = %d, PPID = %d\n", i, getpid(), getppid());
break;
} else if (pid == 0) {
// On se trouve dans le processus fils
continue;
} else {
perror("fork");
return 1;
}
}
if (pid == 0) {
// Dernier processus (ne crée pas de fils)
printf("Dernier processus (n°%d), PID = %d, PPID = %d\n", NB_FILS, getpid(), getppid());
}
return 0;
}Dernier processus (n°4), PID = 28586, PPID = 28585
Processus 3 terminé, PID = 28585, PPID = 28584
Processus 2 terminé, PID = 28584, PPID = 28583
Processus 1 terminé, PID = 28583, PPID = 28582
Processus 0 terminé, PID = 28582, PPID = 28574
Voici ce qu’il se passe :
- On définit une variable pour stocker la valeur du
pid. - On boucle
NB_FILSfois avec unfor- Création d’un fils
- Si le
pid==-1erreur - Si le
pid==0on est dans le fils on fait rien - Si le
pid>0on est dans le père alors ce dernier doit attendre la fin de son fils pour continuer
- Enfin, on s’occupe du processus en fin de ligne, on affiche juste qu’il existe et que c’est le dernier de la ligne.
On obtiendra ainsi la chaine suivante :
On prend les deux erniers chiffres de chaque pid pour aller plus vite…
82 → 83 → 84 → 85 → 86
Topologie en étoile
P2
↑
P3 ← P1 → P2
...
Le père est le processus central, il créé plusieurs fils, il doit attendre que tous se terminent et il se terminera après. En gros le père vas créer n fils qui seront tous directement relié à lui.
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define NB_FILS 4
int main() {
pid_t pid;
for (int i = 0; i < NB_FILS; i++) {
pid = fork();
if (pid == 0) {
printf("Fils %d, PID = %d, PPID = %d\n", i+1, getpid(), getppid());
return 0; // Le fils termine
}
}
// Le parent attend la fin de tous ses fils
for (int i = 0; i < NB_FILS; i++) {
wait(NULL);
}
printf("Mes fils se sont bien terminés, je peux me terminer aussi !\n");
return 0;
}Fils 1, PID = 1415, PPID = 1414
Fils 2, PID = 1416, PPID = 1414
Fils 3, PID = 1417, PPID = 1414
Fils 4, PID = 1418, PPID = 1414
Mes fils se sont bien terminés, je peux me terminer aussi !
Voilà ce qu’il se passe :
- Le père créé chaque fils un par un à l’aide de la première boucle
for - Chaque fils affiche son identité et se termine
- Le deuxième
forindique au père qu’il doit attendre que ses fils terminent pour pouvoir finir. - Le père indique que ses fils ont terminés et termine à son tour.