C'est pour simplifier l'interface. L’alternative à fork
et exec
ressemblerait à la fonction CreateProcess de Windows . Notez combien de paramètres CreateProcess
ont, et beaucoup d’entre eux sont des structures avec encore plus de paramètres. En effet, tout ce que vous souhaitez contrôler sur le nouveau processus doit être transmis CreateProcess
. En fait, le nombre de CreateProcess
paramètres étant insuffisant, Microsoft a donc 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 préservés exec
. Cela vous permet de fork
modifier les attributs de processus de votre choix (en utilisant les mêmes fonctions que vous utiliseriez normalement), puis exec
. Sous Linux, fork
n’a pas de paramètre et execve
n’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 wrappers execve
fournis par la bibliothèque C pour simplifier les cas d'utilisation courants.)
Si vous voulez commencer un processus avec un autre répertoire courant: fork
, chdir
, exec
.
Si vous souhaitez rediriger stdin / stdout: fork
, fichiers ouverture / fermeture, exec
.
Si vous voulez les utilisateurs du commutateur: fork
, setuid
, exec
.
Toutes ces choses peuvent être combinées au besoin. Si quelqu'un propose un nouveau type d'attribut de processus, vous n'avez pas à changer fork
et exec
.
Comme mentionné ci-dessus, la plupart des Unix modernes utilisent la copie sur écriture, ce fork
qui ne nécessite pas de temps système important.
fork(2)
page de manuel sous Linux indique:Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child.
J'imagine (mais je ne le sais pas avec certitude) que c'est le cas pour d'autres versions Unix modernes.