115 votes

Quel est le but de fork() ?

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 ?

134voto

tgamblin Points 25755

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 :

  1. Votre coquille utilise fork pour exécuter les programmes que vous invoquez depuis la ligne de commande.
  2. 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.
  3. 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.
  4. 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.
  5. Les langages de script utilisent fork indirectement pour démarrer les processus enfants. Par exemple, chaque fois que vous utilisez une commande comme subprocess.Popen en Python, vous fork 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.

22voto

Daniel C. Sobral Points 159554

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.

13voto

Nave Points 215

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.

12voto

Wadih M. Points 5161

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éé)

http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html

10voto

cloudhead Points 10279

Fork() va créer un nouveau processus enfant identique au parent. Ainsi, tout ce que vous exécutez dans le code après cela sera exécuté par les deux processus - très utile si vous avez par exemple un serveur, et que vous voulez gérer de multiples requêtes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X