GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi le mécanisme de création de processus par défaut est-il un fork ?

L'appel système UNIX pour la création de processus, fork(), crée un processus enfant en copiant le processus parent. Ma compréhension est que cela est presque toujours suivi d'un appel à exec() pour remplacer l'espace mémoire du processus enfant (y compris le segment de texte). Copier l'espace mémoire du parent dans fork() m'a toujours semblé inutile (bien que je réalise que le gaspillage peut être minimisé en faisant en sorte que les segments de mémoire soient copiés sur écriture afin que seuls les pointeurs soient copiés). Quoi qu'il en soit, quelqu'un sait-il pourquoi cette approche de duplication est nécessaire pour la création de processus ?

Réponse acceptée :

C'est pour simplifier l'interface. L'alternative à fork et exec serait quelque chose comme la fonction CreateProcess de Windows. Remarquez combien de paramètres CreateProcess a, et beaucoup d'entre eux sont des structures avec encore plus de paramètres. C'est parce que tout vous voudrez peut-être contrôler le nouveau processus doit être passé à CreateProcess . En fait, CreateProcess n'a pas assez de paramètres, donc Microsoft a dû ajouter CreateProcessAsUser et CreateProcessWithLogonW.

Avec le fork/exec modèle, vous n'avez pas besoin de tous ces paramètres. Au lieu de cela, certains attributs du processus sont conservés dans exec . Cela vous permet de fork , puis modifiez les attributs de processus que vous souhaitez (en utilisant les mêmes fonctions que vous utiliseriez normalement), et puis exec . Sous Linux, fork n'a pas de paramètres, et execve n'en a que 3 :le programme à exécuter, la ligne de commande à lui donner et son environnement. (Il existe d'autres exec fonctions, mais ce ne sont que des enveloppes autour de execve fourni par la bibliothèque C pour simplifier les cas d'utilisation courants.)

Si vous souhaitez démarrer un processus avec un répertoire courant différent :fork , chdir , exec .

Si vous souhaitez rediriger stdin/stdout :fork , fermer/ouvrir des fichiers, exec .

Si vous souhaitez changer d'utilisateur :fork , setuid , exec .

Toutes ces choses peuvent être combinées selon les besoins. Si quelqu'un propose un nouveau type d'attribut de processus, vous n'avez pas à modifier fork et exec .

Comme larsks l'a mentionné, la plupart des Unix modernes utilisent la copie sur écriture, donc fork n'implique pas de frais généraux importants.


Linux
  1. Pourquoi le serveur a-t-il bloqué mon IP ?

  2. Grep - Pourquoi les crochets dans le modèle Grep suppriment-ils le processus Grep des résultats Ps?

  3. Pourquoi le Pgid des processus enfants n'est-il pas le PID du parent ?

  4. Pourquoi Python 2.7 est-il toujours la version Python par défaut dans Ubuntu ?

  5. Pourquoi le segment .bss est-il requis ?

Pourquoi Nullglob n'est-il pas par défaut ?

Aperçu - Une fourche du GIMP

La différence entre fork(), vfork(), exec() et clone()

pourquoi la liste des frères et sœurs est utilisée pour obtenir le task_struct lors de la récupération des enfants d'un processus

Pourquoi sed n'utilise-t-il pas le mode regex étendu par défaut ?

Pourquoi vfork() est-il destiné à être utilisé lorsque le processus enfant appelle exec() ou exit() immédiatement après la création ?