Fork (), l’appel système UNIX pour la création de processus, crée un processus enfant en copiant le processus parent. D'après ce que je comprends, ceci est presque toujours suivi d'un appel à exec () pour remplacer l'espace mémoire du processus enfant (segment de texte compris). Copier l'espace mémoire du parent dans fork () m'a toujours semblé inutile (bien que je sache que le gaspillage peut être minimisé en faisant une copie sur écriture des segments de mémoire, de sorte que seuls les pointeurs soient copiés). Quoi qu'il en soit, quelqu'un sait-il pourquoi cette approche de duplication est requise pour la création de processus?
process
process-management
fork
Ellen Spertus
la source
la source
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.select
étaient cassés, mais c'est une autre histoire).Réponses:
C'est pour simplifier l'interface. L’alternative à
fork
etexec
ressemblerait à la fonction CreateProcess de Windows . Notez combien de paramètresCreateProcess
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 transmisCreateProcess
. En fait, le nombre deCreateProcess
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ésexec
. Cela vous permet defork
modifier les attributs de processus de votre choix (en utilisant les mêmes fonctions que vous utiliseriez normalement), puisexec
. Sous Linux,fork
n’a pas de paramètre etexecve
n’a que 3: le programme à exécuter, la ligne de commande à lui donner et son environnement. (Il existe d'autresexec
fonctions, mais ce ne sont que des wrappersexecve
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
etexec
.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.la source
En plus de la réponse de cjm, la spécification Single Unix définit une fonction nommée
vfork()
. Cette fonction fonctionne comme un fork, sauf que le processus fork a un comportement indéfini s'il ne fait rien d'autre qu'appeler une fonction de la famille exec ou un appel_exit()
.Ainsi, à peu près, la seule utilisation avec un comportement défini est:
Alors, que fait
vfork
-on? C'est peu coûteuxfork
. Dans les implémentations sans copie sur écriture, le processus résultant partagera de l'espace mémoire avec le processus d'origine (d'où le comportement indéfini). Dans les implémentations avec copie sur écriture, ilvfork
est permis d’être identique àfork()
, étant donné que les implémentations de copie sur écriture sont rapides.Il existe également une
posix_spawn
fonction optionnelle (et uneposix_spawnp
fonction) permettant de créer directement un nouveau processus. (Il est également possible de les implémenter avec un appel de bibliothèque utilisantfork
etexec
, et un exemple d'implémentation est fourni.)la source