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.