Exactement ce que fait la fourche de retour?
En cas de succès, le PID de l'enfant
le processus est retourné à la société mère
l'exécution du thread, et un 0 est
renvoyé de l'enfant à l'exécution du thread.
p = fork();
Je suis confus à sa page de manuel,est p
égal à 0
ou PID
?
- Quelqu'un peut-il inclure
getpid()
dans l'image?getpid()
de l'enfant retourne 0? - Donc ne
fork()
. - Il est à la fois pid et 0. Lorsque la fourche est appelé, le programme "divise" en deux, en lui-même et son double maléfique. Dans le programme d'origine, elle est de 0. Dans le jumeau maléfique du programme, c'est le pid.
- Je crois qu'un
fork
retourne une petite portion de nourriture, mais je peux me tromper. 😉 - Ce qu'il ya à être confus au sujet? La documentation que vous avez cité est tout à fait clair.
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de savoir comment le manuel peut être plus clair!
fork()
crée un nouveau processus, de sorte que vous avez maintenant deux identiques processus. Pour distinguer entre eux, la valeur de retour defork()
diffère. Dans le processus d'origine, vous obtenez le PID du processus fils. Dans le processus de l'enfant, vous obtenez 0.Donc un canoniques comme suit:
0
signifie aussi pas de processus est créé,à droite?Sinon, les processus seront créés de manière récursive,ne jamais s'arrêter...fork
.fork()
appel.fork
impossible, de sorte qu'il retourne-1
, pas0
, et définiterrno
de façon appropriée. Il le fait dans le processus d'origine (qui n'est pas un parent, car aucun processus n'a été créé).Une fois
fork
est exécutée, vous avez deux processus. L'appel renvoie des valeurs différentes pour chaque processus.Si vous faites quelque chose comme cela
Vous verrez à la fois les messages imprimés. Ils sont imprimés par deux processus distincts. C'est la façon que vous pouvez faire la distinction entre les deux processus de création.
fork
ne pas créer un processus,non?-1
est retourné, cela signifie qu'aucun enfant n'a été créé. La page de man indique ce.fork()
dans une boucle while , je ne serai jamais à être obtenir la valeur de -1?errno
est définie si elle renvoie -1 de sorte que vous savez pourquoi il a échoué.Processus sont structurés dans un dirigé arbre où vous ne connaissez que votre monoparentale (
getppid()
). En bref,fork()
retourne-1
sur erreur comme beaucoup d'autres fonctions du système, valeur non nulle est utile pour l'initiateur de la fourche à l'appel (le parent) de savoir son enfant pid.Rien n'est aussi bon que exemple:
Et le résultat (bash est pid 2249, dans ce cas):
Si vous avez besoin de partager des ressources (fichiers, parent pid, etc.) entre le parent et l'enfant, regardez
clone()
(pour la bibliothèque C de GNU, et peut-être d'autres)C'est la partie la plus cool. Il est égal à DEUX.
Bien, pas vraiment. Mais une fois
fork
retourne, vous avez maintenant deux copies de votre programme en cours d'exécution! Deux processus. Vous pouvez sorte de penser à eux en tant que d'autres univers. Dans l'un, la valeur de retour est0
. Dans l'autre, c'est laID
de la nouvelle procédure!Habituellement, vous aurez quelque chose comme ceci:
Dans ce cas, les deux chaînes sera imprimée, mais par des procédés différents!
fork()
est invoquée dans le processus parent. Ensuite, un processus enfant est engendré. Par le temps que l'enfant processus génère,fork()
a terminé son exécution.À ce point,
fork()
est prêt à revenir, mais il renvoie une valeur différente selon qu'il s'agisse de la mère ou de l'enfant. Dans le processus de l'enfant, elle renvoie la valeur 0, et dans le processus parent/thread, il renvoie l'enfant de l'ID de processus.fork
évalue àNO Operation
dans le processus de l'enfant?0
moyen de l'enfant dans le processus,mais il signifie aussi, sans supplément de processus est créé?fork
la fois, un processus est créé. Je ne comprends pas votre question.Fourche crée un double processus et un nouveau contexte de processus. Lorsqu'elle retourne une valeur de 0 signifie que l'enfant d'un processus est en cours, mais lorsqu'il renvoie à une autre valeur que signifie un processus parent est en cours d'exécution. Nous utilisons habituellement attendre déclaration pour qu'un enfant à la fin du processus et processus parent commence à s'exécuter.
Je pense que ça marche comme ça:
lorsque pid = fork(), le code doit être exécuté deux fois, on est dans le processus actuel, on est en processus enfant.
Donc, il explique pourquoi si/d'autre fois exécuter.
Et l'ordre est, premier processus actuel, et ensuite exécuter l'enfant.