comment créer deux processus à partir d'un seul Parent
Je sais que je vais avoir besoin d'utiliser fork(), mais cela crée un processus fils. Dois-je tout simplement appel à la fourche à nouveau à partir de l'intérieur le processus de l'enfant? Aussi, j'ai besoin de communiquer entre eux par l'intermédiaire d'un signal ou d'un tuyau, ce qui est plus facile à mettre en œuvre et de quoi ai-je besoin de savoir pour le faire (fonctions, etc..)
OriginalL'auteur fifamaniac04 | 2011-07-01
Vous devez vous connecter pour publier un commentaire.
Pour créer un deuxième processus d'appel
fork()
de nouveau au sein de la société mère ou à l'enfant (mais pas les deux!). Qui que vous choisissez dépend de si vous voulez que ce processus d'être un enfant de l'original parent ou d'un enfant du premier enfant (il est habituel pour qu'il soit un enfant du parent d'origine).Communiquer au moyen d'un tuyau est beaucoup plus simple et plus fiable que l'utilisation de signaux.
pipe()
,close()
,read()
,write()
etselect()
sont les fonctions clés ici.Par exemple, le parent créer deux processus enfants, vous voulez faire quelque chose comme:
Non, vous devez seulement appeler
fork()
la deuxième fois dans le processus parent, ce qui signifie que si la premièrefork()
retourné non nulle. Si vous appelez simplementfork()
deux fois dans une rangée, puis à la fois le parent et le premier enfant d'exécuter la deuxièmefork()
, et donc vous aurez de deux, d'autres processus de création. Voir mise à jour de réponse.J'ai mis un tuyau dans le présent code, child_a écrit à la pipe, child_b lit à partir de la pipe, lorsque j'exécute le code pour la première fois child_b imprime "reçu:" et puis imprime les tampons de contenu normalement, mais lorsque je l'exécute à nouveau, il se contente d'afficher une chaîne de caractères vide de sens, il n'a pas vraiment d'entrer dans le child_b du code et des sorties. Pouvez-vous aider?
une nouvelle question avec votre code qui a le problème.
OriginalL'auteur caf
de sortie :
OriginalL'auteur Manas Kinkar
Vous pouvez mettre la fourche dans une boucle et générer autant de processus enfants que vous avez besoin.
Je l'ai fait sur un projet récemment.
Log_Print() et Err_Print() sont des fonctions internes, mais tout à fait évident alors je les laisse comme ils sont.
Il y a un aspect avec les variables qui doit être expliqué.
nSon
etnSonAsked
doivent être déclarés comme globals pas comme variables de pile. De cette façon, leur valeur persiste dans la fourche processus. Cela signifie que lenSon
variable aura une valeur différente dans chacun des enfants. Cela lui permet d'avoir un simple schéma de numérotation de laownpid()
nombre.Pour l'obtenir complètement à droite, il y a beaucoup de détails pour obtenir le droit. Vous aurez à définir les gestionnaires de signaux dans le processus père pour détecter la mort d'un enfant, de même dans l'autre sens (seulement possible sur Linux, Unix (au moins Solaris) ne supportent pas les parents des signaux de mort).
Vous devez être conscient du fait que les descripteurs de fichiers ouverts dans le processus père sera également ouvert à l'enfant après la fourche, et il sera le même un. Cela ouvre beaucoup de problèmes de concurrence d'accès si vous n'êtes pas au courant (la solution est d'utiliser
dup()
etclose()
dans les bons endroits).OriginalL'auteur Patrick Schlüter
OriginalL'auteur Abhinav Jayanthy
Dans cet exemple
ils sont juste dormir un peu aléatoire de la sec. Il a aussi tout le pid, afin que nous puissions envoyer SIGNAL pour communiquer...
la Plupart de la #inclut font l'objet de commentaires parce qu'ils étaient inutiles, où j'ai compilé.
Le 'pour' cycle 'N' processus avec " fork()'. Les enfants des processus qui fera appel à la fonction de démarrage. Dans la fonction de démarrage vous pouvez faire ce que vous voulez.
Les "pour" boucle faire 'N' processus avec " fork()'. Les enfants des processus qui fera appel à la fonction de démarrage. Dans la fonction de démarrage vous pouvez faire ce que vous voulez. Dans cet exemple, ils sont juste dormir un peu aléatoire de la sec. Le deuxième 'pour' boucle dans le wait(NULL) l'état ne se déplacent que sur, quand un processus terminé, donc elle attend jusqu'à ce que 'N' proc se termine. Il a aussi tout le pid, afin que nous puissions envoyer des signaux pour communiquer... la Plupart du #inclut font l'objet de commentaires parce qu'ils étaient inutiles, où j'ai compilé.
Ce que @Koopakiller suggère, et je suis d'accord, c'est que vous devez vous modifier votre question avec cette information. Cela fera une bonne réponse.
Le problème avec cette solution est que les enfants fourche processus trop. Vous pouvez capturer le parent pid avant d'entrer dans la première boucle, puis mettre l'ensemble du bloc à l'intérieur de la boucle du corps dans une instruction if pour vérifier si le courant id de processus est le même que le parent.
OriginalL'auteur HovaMegy
Juste une petite contribution, si vous souhaitez créer 2 enfants de la même mère que vous pourriez utiliser ce code ci-dessous. Dans laquelle un père de créer 2 processus fils (paresseux et actifs).
Si vous exécutez ce code, vous devriez obtenir un résultat similaire:
OriginalL'auteur Wilton Rodrigues
OriginalL'auteur MIGUEL A POLANCO