Dans de nombreux programmes et pages de manuel de Linux, j'ai vu du code utilisant fork()
. Pourquoi avons-nous besoin d'utiliser fork()
et quel est son but ?
Réponses
Trop de publicités?fork()
est la façon dont vous créez de nouveaux processus dans Unix. Lorsque vous appelez fork
vous créez une copie de votre propre processus qui a son propre espace adresse . Cela permet à plusieurs tâches de s'exécuter indépendamment les unes des autres, comme si elles disposaient chacune de la totalité de la mémoire de la machine.
Voici quelques exemples d'utilisation de fork
:
- Votre coquille utilise
fork
pour exécuter les programmes que vous invoquez depuis la ligne de commande. - Les serveurs web comme apache utiliser
fork
pour créer plusieurs processus de serveur, chacun d'entre eux traitant les demandes dans son propre espace d'adressage. Si l'un d'eux meurt ou perd de la mémoire, les autres ne sont pas affectés, ce qui constitue un mécanisme de tolérance aux pannes. -
Google Chrome utilise
fork
pour traiter chaque page dans un processus distinct. Cela empêchera le code côté client d'une page de faire tomber tout le navigateur. -
fork
est utilisé pour lancer des processus dans certains programmes parallèles (comme ceux écrits à l'aide de la fonction MPI ). Notez que ceci est différent de l'utilisation de fils qui n'ont pas leur propre espace d'adressage et qui existent sur un processus. - Les langages de script utilisent
fork
indirectement pour démarrer les processus enfants. Par exemple, chaque fois que vous utilisez une commande commesubprocess.Popen
en Python, vousfork
un processus enfant et lire sa sortie. Cela permet aux programmes de travailler ensemble.
Utilisation typique de fork
dans un shell pourrait ressembler à quelque chose comme ça :
int child_process_id = fork();
if (child_process_id) {
// Fork returns a valid pid in the parent process. Parent executes this.
// wait for the child process to complete
waitpid(child_process_id, ...); // omitted extra args for brevity
// child process finished!
} else {
// Fork returns 0 in the child process. Child executes this.
// new argv array for the child process
const char *argv[] = {"arg1", "arg2", "arg3", NULL};
// now start executing some other program
exec("/path/to/a/program", argv);
}
Le shell génère un processus enfant en utilisant exec
et attend qu'elle se termine, puis poursuit sa propre exécution. Notez que vous n'êtes pas obligé d'utiliser fork de cette façon. Vous pouvez toujours créer de nombreux processus enfants, comme le ferait un programme parallèle, et chacun d'eux pourrait exécuter un programme simultanément. En fait, à chaque fois que vous créez de nouveaux processus dans un système Unix, vous utilisez la commande fork()
. Pour l'équivalent Windows, voir CreateProcess
.
Si vous voulez plus d'exemples et une explication plus longue, Wikipedia a un résumé décent. Et voici quelques diapositives ici sur le fonctionnement des processus, des threads et de la concurrence dans les systèmes d'exploitation modernes.
Fork() est la façon dont Unix crée de nouveaux processus. Au moment où vous avez appelé fork(), votre processus est cloné, et deux processus différents continuent l'exécution à partir de là. L'un d'entre eux, l'enfant, verra fork() retourner 0. L'autre, le parent, verra fork() retourner le PID (process ID) de l'enfant.
Par exemple, si vous tapez ce qui suit dans un shell, le programme shell appellera fork(), puis exécutera la commande que vous avez passée (telnetd, dans ce cas) dans le fils, tandis que le parent affichera à nouveau l'invite, ainsi qu'un message indiquant le PID du processus d'arrière-plan.
$ telnetd &
Quant à la raison pour laquelle vous créez de nouveaux processus, c'est la façon dont votre système d'exploitation peut faire plusieurs choses en même temps. C'est pourquoi vous pouvez exécuter un programme et, pendant qu'il est en cours, passer à une autre fenêtre et faire autre chose.
Fork() est essentiellement utilisé pour créer un processus enfant pour le processus dans lequel vous appelez cette fonction. Chaque fois que vous appelez un fork(), il renvoie un zéro pour l'identifiant de l'enfant.
pid=fork()
if pid==0
//this is the child process
else if pid!=0
//this is the parent process
Vous pouvez ainsi fournir des actions différentes pour le parent et l'enfant et utiliser la fonction multithreading.
Fork() est utilisé pour créer un processus enfant. Lorsqu'une fonction fork() est appelée, un nouveau processus est créé et l'appel à la fonction fork() renvoie une valeur différente pour l'enfant et le parent.
Si la valeur de retour est 0, vous savez que vous êtes le processus enfant et si la valeur de retour est un nombre (qui se trouve être l'identifiant du processus enfant), vous savez que vous êtes le parent. (et si c'est un nombre négatif, le fork a échoué et aucun processus enfant n'a été créé)
- Réponses précédentes
- Plus de réponses