FORK |
Fourchette |
|---|---|
Perl |
Syntaxe
| fork |
Retour
| Valeur | Description |
|---|---|
| undef | Cette valeur permet d'indiquer la fonction n'a pas réussi l'opération. |
| 0 | Ces valeurs permet d'indiquer le processus enfant. |
| variable | Ces valeurs permet d'indiquer l'identificateur de processus parent. |
Description
Cette fonction permet de créer un processus fils.
Remarques
- Création d'un processus indépendant : La fonction fork permet de dupliquer le processus courant, en créant un nouveau processus (appelé processus fils) héritant du même environnement que le parent. Cette opération est fondamentale en programmation système pour exécuter des tâches en parallèle ou isoler certaines portions de traitement.
- Valeurs de retour différenciées : La puissance de fork réside dans sa valeur de retour : dans le processus parent, elle retourne le PID du processus fils, tandis que dans le fils, elle retourne 0. Cela permet d'implémenter facilement deux chemins d'exécution distincts, chacun adapté à son rôle (parent ou enfant), sans code complexe.
- Gestion des erreurs : Lorsque fork échoue (par exemple à cause de ressources système insuffisantes), elle retourne undef. Il est crucial de tester ce cas et de réagir en conséquence, car un script qui dépend de la création d'un processus fils peut se comporter de façon imprévisible s'il ne vérifie pas cette condition.
- Utilité pour les traitements en arrière-plan (services) : En associant fork à d'autres appels système (comme setsid et exec), on peut créer un service, c'est-à-dire un processus tournant en arrière-plan. Cela est couramment utilisé pour écrire des serveurs Perl ou des tâches planifiées indépendantes du terminal.
- Pas d'exécution concurrente automatique : Bien que fork crée un nouveau processus, il ne fournit aucune synchronisation ou gestion automatique de la concurrence. Cela signifie que les deux processus peuvent modifier les mêmes fichiers ou variables (copiées) de manière non coordonnée, ce qui peut provoquer des conflits sans précaution supplémentaire.
- Mémoire partagée ou dupliquée ? Lorsqu'un processus est forké, l'espace mémoire est copié (copy-on-write) : le fils et le parent possèdent chacun leur propre copie. Les modifications apportées dans un processus ne sont donc pas visibles dans l'autre. Cela protège l'isolation, mais peut surprendre si l'on espérait partager des variables.
- Utilisation typique avec wait ou waitpid : Après un fork, il est souvent recommandé que le parent appelle wait ou waitpid pour éviter de créer des processus zombies. Ces fonctions permettent au parent de récupérer l'état de terminaison de l'enfant. Omettre cela peut entraîner une accumulation de processus terminés mais non libérés.
- Essentiel pour la programmation réseau : Dans les serveurs Perl basés sur des sockets, fork est souvent utilisé pour gérer chaque connexion entrante dans un processus indépendant, assurant ainsi que les clients ne se bloquent pas mutuellement. Cela permet de développer des architectures robustes et mise à l'échelle avec un minimum de complexité.
Exemples
Voici un exemple montrant comment lancer un processus fils :
on obtiendra le résultat suivant :
Le programme parent!Le programme fils!
Fin!
Voici un exemple montrant comment lancer deux processus fils :
on obtiendra le résultat suivant :
Le programme parent!Le programme fils 1!
Le programme fils 2!
Fin!
Voir également
Articles - Fork bomb
Langage de programmation - Perl - Référence de procédures et fonctions - POSIX::fork
Références
La Bible Micro Application HTML & Développement Web, Stefan Munz, Wolfgang Nefzger, 2003, ISBN: 2-7429-2898-7, page 1190
Dernière mise à jour : Dimanche, le 18 octobre 2015