Fork (programmation)

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir fork.

La fonction fork fait partie des appels système standard d'UNIX (norme POSIX[1]). Cette fonction permet à un processus (un programme en cours d'exécution) de donner naissance à un nouveau processus qui est sa copie conforme, par exemple en vue de réaliser un second traitement parallèlement au premier. Un bon moyen de visualiser l'effet d'un fork sur un processus est d'imaginer une bactérie qui se coupe en deux.

Il existe une filiation dans les processus : le créateur d'un nouveau processus est appelé le père et le nouveau processus, le fils. Tous les attributs système du père (par exemple les droits sur le système de fichier) sont transmis au fils, de la même manière que l'héritage. Au démarrage d'un système Unix, un seul processus existe (de numéro 1). Tous les autres processus qui peuvent exister au cours de la vie du système descendent de ce premier processus via des appels système fork successifs.

Fonctionnement[modifier | modifier le code]

L'appel système fork fournit une valeur résultat qui est un entier. Pour identifier le père du fils nouvellement crée, il suffit de regarder la valeur de retour du fork() que l'on appelle plus communément le PID (identifiant de processus). Si le PID vaut 0, alors il s'agit du fils, sinon c'est le père.

Afin d'obtenir le numéro du processus, il suffit de faire l'appel système getpid(), ou getppid() pour obtenir le numéro du père.

Interactions entre processus[modifier | modifier le code]

Il est possible d’interagir entre processus de plusieurs manière différentes. Premièrement on peux envoyer des signaux. En langage de commande kill <pid> permet de tuer le processus ayant pour pid ce que l'on entre dans la commande.

Il est possible de faire attendre un processus grâce à sleep(n) pour bloquer le processus pendant n secondes, ou en utilisant pause() qui bloque jusqu'à la réception d'un signal.

Pour mettre fin à un processus on peux utiliser exit(etat) sachant que etat est un code de fin, par convention 0 si ok, code d'erreur sinon (cf errno).

Il peut être très pratique que le père attende la fin de l'un de ses fils, pour ce faire on utilise pid_t wait(int *ptr_etat) qui donne comme valeur de retour le pid du fils qui a terminé, et le code de fin est stocké dans ptr_etat.

On peux également attendre la fin du fils grâce à son pid : pid_t waitpid(pid_t pid, int *ptr_etat, int options).

Un terme commun dans la partie "Système" de l'informatique est ce que l'on appelle les processus zombies. Cela arrive quand le processus est terminé mais que le père n'a pas attendu son fils, c'est-à-dire qu'il n'a pas fait d'appels à wait(). Il faut absolument éviter cela car le processus ne peut plus s'exécuter mais consomme encore des ressources !

Processus zombie

Utilisation et alternative[modifier | modifier le code]

Chaque processus d'un fork possède son propre espace d'adressage, qu'il est coûteux de dupliquer, même avec des astuces comme le copie-sur-écriture. Il est parfois avantageux de remplacer les forks par des fils (processus légers) qui partagent le même espace mémoire… aux risques et périls du programmeur, cependant.

La fonction fork est largement utilisée dans les applications client-serveur avec plusieurs clients simultanés.

Notes et références[modifier | modifier le code]

Voir aussi[modifier | modifier le code]