C'est pour simplifier l'interface. L’alternative à forket execressemblerait à la fonction CreateProcess de Windows . Notez combien de paramètres CreateProcessont, 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 CreateProcessparamètres étant insuffisant, Microsoft a donc dû ajouter CreateProcessAsUser et CreateProcessWithLogonW .
Avec le fork/execmodè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 forkmodifier les attributs de processus de votre choix (en utilisant les mêmes fonctions que vous utiliseriez normalement), puis exec . Sous Linux, forkn’a pas de paramètre et execven’a que 3: le programme à exécuter, la ligne de commande à lui donner et son environnement. (Il existe d'autres execfonctions, mais ce ne sont que des wrappers execvefournis 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 forket exec.
Comme mentionné ci-dessus, la plupart des Unix modernes utilisent la copie sur écriture, ce forkqui 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.