de travail de la fourche en langage c
Maintenant j'ai un problème dans la compréhension du travail de fork()
appel système.
J'écris un code qui suit :
#include<stdio.h>
int main()
{
int a, b;
b=fork();
printf("\n the value of b = %d",b);
}
La sortie de ce code est la suivante :
Maintenant, je ne comprends pas pourquoi la sortie, c'est comme cela ?
Après que je viens d'ajouter une ligne à mon code et la sortie est complètement différent.
mon code est le suivant:
int main()
{
int a, b;
b=fork();
Lorsque j'exécute le code de sortie est le suivant
2389my nom de manish
the value of b = 0
Maintenant, je suis totalement confus sur le travail de fork()
appel.
Mes question sont les suivantes:
- Comment
fork()
fonctionne? - Où le contrôle se passe après la
fork()
appel? - Tout organisme peut expliquer pourquoi les sorties de codes écrits dans le problème?
- Pourquoi la sortie de
b
se produisant dans différents lieux dans le premier code
la sortie deb = 2260
est juste avant la sortieb = 0
alors que la valeur deb = 2389
n'est pas juste avant leb = 0
?
Merci de m'expliquer le fonctionnement de la fourche dans le code écrit dans le problème afin que je puisse l'apprendre correctement .
OriginalL'auteur Golu | 2011-06-02
Vous devez vous connecter pour publier un commentaire.
Il pourrait aider à comprendre d'abord pourquoi le mot de fourche a été utilisé pour nommer cette fonction. Jamais entendu parler d'une "bifurcation sur la route?" À une bifurcation, le processus a pour diviser les chemins d'accès.
Il y a d'abord un processus unique de l'exécution normalement jusqu'à ce que vous atteignez le
fork
appel. Lorsque la fourche est appelé, un nouveau processus est créé, qui est identique dans tous les sens comme le processus d'origine, sauf pour la valeur de retour de la fourche de la fonction. Le nouveau processus est appelé le processus de l'enfant, et par conséquent, le processus qui a donné naissance il est désigné comme le processus parent.Puisque vous voulez effectuer des tâches différentes pour chaque branche de la fourche, il faut que vous soyez capable de distinguer le processus fils du processus parent. C'est là que la valeur de retour de
fork
:fork
retourne l'id de processus (pid) de l'enfant (le processus créé récemment) à la société mère; elle renvoie la valeur 0 à l'enfant. Aussi, si l'exécution defork
aller mal, la valeur de retour est -1.Dans votre code, vous n'avez pas de différence entre l'enfant et le parent processus, de sorte que les deux processus, tout le code qui suit, après la
fork
appel.Comme vous pouvez le voir, les deux processus ont le même code à la suite de la fourche, d'où la sortie est répété. Peut-être que si vous souhaitez que le processus parent à la sortie de Manish et de l'enfant à la sortie Anil, alors vous pouvez faire quelque chose comme:
Enfin, le dernier commentaire qui doit être fait est que, dans votre code, le résultat semble avoir été exécuté en premier par un processus dans son ensemble, et puis les autres processus dans sa totalité. Qui peut ne pas toujours être le cas. Par exemple, le système d'exploitation peut permettre à la mère d'exécuter le " manish de sortie, puis de rendre ce processus attendre, et la remise de la cpu sur le processus de l'enfant, qui exécute alors 'virile'. Cependant, le processus de l'enfant peut continuer et exécuter 'anil' et 'b' sorties, de l'achèvement de l'exécution du processus fils et donc le retour de l'exécution de retour au processus parent. Maintenant, le parent termine son exécution par la sortie de 'anil' et 'b' lui-même. La sortie finale de l'exécution de ce programme peut ressembler à quelque chose comme:
Prendre un coup d'oeil à la page de man pour
fork
.Aussi regarder
waitpid
pour sa bonne gestion de processus enfants par parent processus afin de ne pas créer des zombies.Edit: En réponse à vos questions dans les commentaires, je vais répondre à comment vous pouvez simplement exécuter chaque processus consécutivement.
Bien sûr, n'est pas le meilleur code, mais c'est juste pour illustrer ce point. La grande idée ici est le
waitpid
appel, ce qui provoque le processus parent d'attendre jusqu'à ce que le processus de l'enfant justefork
ed à la fin. Après que l'enfant prcoess terminée, le parent continue après lawaitpid
appel, à partir d'une autre itération de lafor
boucle et la bifurcation de l'autre (la prochaine). Cela continue jusqu'à ce que tous les enfants de processus ont été exécutées de manière séquentielle et l'exécution renvoie enfin à la société mère.circulation réponse!
Dans votre exemple
the value of b = 0 // parent
. Si cette lecturethe value of b = 0 // child
à la place ?Belle prise. Fixe
OriginalL'auteur
fork()
a été appelé.b
est de 0. Dans le processus d'origine, la valeur deb
est l'ID de processus de la copie d'un processus.OriginalL'auteur Chris Frederick
Fourche est mis en œuvre par le système d'exploitation. Essentiellement, il crée un processus fils et commence à courir après le
fork()
.Le processus parent reçoit l'id de processus du processus de fichier:
b=fork();
b a l'id de processus. Le processus de l'enfant d'obtenir un pid de zéro.(et 4) Parce que les deux processus peuvent s'exécuter en parallèle ou être temps de trancher, de votre sortie variera.
Vous pouvez vérifier cela: http://en.wikipedia.org/wiki/Fork_(operating_system)
OriginalL'auteur Richard Schneider
Vous feriez mieux de commencer à partir de cette.
Vous trouverez ici l'explication et exemple de code.
OriginalL'auteur Sergei Nikulov