Je cherchais à trouver la différence entre ces quatre sur Google et je m'attendais à ce qu'il y ait une énorme quantité d'informations à ce sujet, mais il n'y avait vraiment pas de comparaison solide entre les quatre appels.
Je me suis mis à essayer de compiler une sorte de coup d'œil de base sur les différences entre ces appels système et voici ce que j'ai obtenu. Toutes ces informations sont-elles correctes / manque-t-il quelque chose d'important?
Fork
: L'appel de fork crée essentiellement un doublon du processus actuel, identique à presque tous les niveaux (tout n'est pas copié, par exemple, les limites de ressources dans certaines implémentations mais l'idée est de créer une copie aussi proche que possible).
Le nouveau processus (enfant) obtient un ID de processus différent (PID) et a le PID de l'ancien processus (parent) comme PID parent (PPID). Étant donné que les deux processus exécutent désormais exactement le même code, ils peuvent déterminer lequel par le code de retour de fork - l'enfant obtient 0, le parent obtient le PID de l'enfant. C'est tout, bien sûr, en supposant que l'appel fork fonctionne - sinon, aucun enfant n'est créé et le parent obtient un code d'erreur.
Vfork
: La différence fondamentale entre vfork et fork est que lorsqu'un nouveau processus est créé avec vfork (), le processus parent est temporairement suspendu et le processus enfant peut emprunter l'espace d'adressage du parent. Cet état de choses étrange se poursuit jusqu'à ce que le processus enfant se termine ou appelle execve (), auquel cas le processus parent continue.
Cela signifie que le processus enfant d'un vfork () doit faire attention à ne pas modifier de manière inattendue les variables du processus parent. En particulier, le processus enfant ne doit pas retourner de la fonction contenant l'appel vfork (), et il ne doit pas appeler exit () (s'il doit quitter, il doit utiliser _exit (); en fait, cela est également vrai pour l'enfant d'une fourche normale ()).
Exec :
L'appel exec est un moyen de remplacer fondamentalement l'ensemble du processus en cours par un nouveau programme. Il charge le programme dans l'espace de processus actuel et l'exécute à partir du point d'entrée. exec () remplace le processus actuel par un exécutable pointé par la fonction. Le contrôle ne revient jamais au programme d'origine, sauf en cas d'erreur exec ().
Clone :
Clone, en tant que fork, crée un nouveau processus. Contrairement à fork, ces appels permettent au processus enfant de partager des parties de son contexte d'exécution avec le processus appelant, comme l'espace mémoire, la table des descripteurs de fichiers et la table des gestionnaires de signaux.
Lorsque le processus enfant est créé avec clone, il exécute l'application de fonction fn (arg). (Cela diffère de fork, où l'exécution continue dans l'enfant à partir du point de l'appel de fork d'origine.) L'argument fn est un pointeur sur une fonction qui est appelée par le processus enfant au début de son exécution. L'argument arg est passé à la fonction fn.
Lorsque l'application de fonction fn (arg) revient, le processus enfant se termine. L'entier renvoyé par fn est le code de sortie du processus enfant. Le processus enfant peut également se terminer explicitement en appelant exit (2) ou après avoir reçu un signal fatal.
Formulaire d'information obtenu:
- Différences entre fork et exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Merci d'avoir pris le temps de lire ceci ! :)
fork()
, ce qu'il est sous Linux, et probablement tous les BSD) empruntant l'espace d'adressage de son parent. Tout ce qu'il fait, en plus d'appeler execve()
ou _exit()
, a un grand potentiel pour gâcher le parent. En particulier, exit()
appelle les atexit()
gestionnaires et autres "finaliseurs", par exemple: il vide les flux stdio. Le retour d'un vfork()
enfant pourrait potentiellement (même mise en garde que précédemment) gâcher la pile des parents.
fork
syscall?