Cours Fork
Cours Fork
Cours Fork
Introduction
Un fork est une fonctionnalité sous les systèmes Unix ou Linux qui permet de dupliquer un processus. Pour
expliquer son fonctionnement, on va partir d'un processus qu'on appellera avec affection "Le Papa". Ce
processus va simplement se dupliquer et les deux processus (le père et le fils) affichent chacun leur statut
(père ou fils).
Lancement du père
Nous allons partir d'un processus père. Afin de bien déterminer les
enjeux du fork, on va également observer ses descripteurs de
fichiers, ou plutôt l'un des plus importants: celui du flux de sortie
(stdout) c'est-à-dire l'écran. On va aussi lui mettre une petite variable
globale qui servira plus tard pour l'affichage du statut du processus
(père ou fils).
On peut voir en rouge les instructions qui ont été exécutées, ainsi
que les données qui ont été modifiées par la dernière instruction.
Jusqu'ici tout va bien, on a changé la valeur de quisuisje pour lui
attribuer l'identité du père. Passons à l'instruction suivante.
Le fork
La prochaine instruction est la plus délicate à comprendre,
exécutons-la et regardons ce qui se passe.
Le père a appelé fork et il s'est dupliqué. Cela implique plusieurs choses:
● Un nouveau processus a été créé, il est considéré comme le fils du processus qui a appelé fork()
● Ce processus est une copie conforme de son père. D'ailleurs, la prochaine instruction à exécuter
sera la même pour les deux : la condition if.
● La fonction fork() ne retourne pas la même chose pour les deux processus. Pour le fils, il
retournera 0. Pour le père, il retourne le pid du fils (son numéro de processus).
● Cette duplication implique certaines choses concernant les variables et les descripteurs de
fichiers. Nous allons y venir.
On continue.
Les variables et les descripteurs de fichiers
La synchronisation
● Côté fils: un printf a été fait, cette fois pour afficher "Je suis Le fils". Le pointeur de fichier a donc
avancé de 15 chez le fils, ce qui se répercute chez le père.
● Côté père: le père a exécuté la fonction wait(). Cette fonction permet la synchronisation entre le
père et tous ses fils. Cela signifie que le père va arrêter de s'exécuter (dans ce cas on dit qu'il
dort) jusqu'à ce que son fils se termine complètement.
La fin
Le fils vient d'exécuter sa dernière instruction ; à présent, il n'existe plus. Pendant ce temps-là, le père était
encore en attente, mais il va bientôt se réveiller puisque le fils est terminé. Enfin, le père se terminera lui
aussi.
Règle d'Or : tout processus UNIX peut créer un ou plusieurs processus. Donc pour créer un
processus nouveau, il en faut déjà un existant ... qui va être cloné, puis spécialisé. Il y a donc une filiation
entre les processus !
Primitives
PID du Père pid_t getppid(void); Retourne le pid du père du processus courant (appelant)
Suspension :
int sleep (int nb_sec); sleep endort le processus jusqu'à ce que nb_sec
secondes se soient écoulées, ou jusqu'à ce qu'un signal non-ignoré soit reçu.
Retourne un entier : En cas de succès: 0 dans le fils et pid du fils dans le père
En cas d’échec : -1 dans le père et le fils n’est pas créé
La valeur
retournée par
fork permet donc
de faire la
distinction entre
le père et le fils !
Bibliothèques :
#include
<sys/types.h>
#include
<unistd.h>
Exemple basique
int main(void)
{ pid_t pid;
pid = fork();
if (pid == 0) printf(" Je suis le FILS ");
else printf(" Je suis le PERE ");
return 0; }
Après fork :
● allocation d’une entée dans la table des processus au nouveau processus
● allocation d ’un pid au nouveau processus
● duplication du contexte du processus père (données, pile…)
● retour du pid du processus fils à son père et 0 au processus fils
Dans le ==père== (PID supposé : 1234) : Dans le ==fils== (PID supposé : 2345):
Affichages :
Je suis le fils
Je suis le pere
j ’attends la fin de mon fils
status = 3
On ne peut pas prédire l'ordre des 3 premiers printf. Par contre on sait forcément que l'affichage du
status se fera en dernier !
● Lorsqu’un processus se termine (exit), le système détruit son contexte, sauf son entrée de la
table des processus
● Le procesus est alors dit dans un état ZOMBI (momentané si bien codé)
● Le processus père récupère la mort de son fils (wait), et détruit son entrée de la table des
processus.
● Le fils disparaît complètement du système (n’est plus zombi).
La communication entre le fils zombi et le père s ’effectue par le biais d ’un signal transmis du fils vers le
père (signal SIGCHLD : la mort du fils). Un processus fils défunt reste zombie jusqu’à ce que son père ait
pris connaissance de sa mort (wait).