Est-il possible d'avoir la canalisation entre les deux processus fils créé par le même parent (LINUX, POSIX)
J'ai plusieurs enfants "en fourche" par le même parent et j'essaie de construire pipe
connexion entre tous ces processus enfant comme une liste liée à la structure. Enfant 1 envoie des données à l'enfant2, enfant 2 enfants 3.... enfant N pour 1 enfant. Est-il une bonne façon de le faire?
En plus, si je créer et de communication entre les processus de la façon dont je force les parents à "attendre" tous les processus de terminer leur travail depuis wait()
ou waitpid()
attend pour le premier processus fini, mais j'ai besoin d'attendre d'eux tous. C'est l'autre question qui se pose.
Merci...
OriginalL'auteur erogol | 2011-03-07
Vous devez vous connecter pour publier un commentaire.
C'est essentiellement ce qu'est un shell ne s'construire une chaîne de redirection, c'est à dire quelque chose comme
Il ya quelques excellentes introducionary textes sur la programmation Unix, dans lequel une simple coquille est mis en œuvre à travers le livre. Et l'une des tâches de la coquille est de la redirection. L'un de ces livres est "Linux Programmation d'Application" par Michael K. Johnson et Erik W. Troan.
Le livre de la page d'accueil: http://ladweb.net/
De construire une chaîne de redirection, pour N processus dont vous avez besoin N-1 tuyaux. Pour chaque redirection de vous créer un canal à l'aide de la
pipe(int fds[2])
appel système. Aprèsfork()
ing, mais avantexecv
ing utilisationdup2(int from, int to)
à "connecter" un tuyau de la fin de l'entrée standard (0) ou d'une norme de sortie de chaque processus. Voici une trop simplifié le code, sans contrôle d'erreur:Prendre note que la conduite du tableau des indices ont été choisies de manière à ce qu'ils reflètent l'entrée/sortie standard des descripteurs de fichiers s'ils sont utilisés pour stdio redirection. Ce choix n'était pas arbitraire.
Bien sûr, vous pouvez raccorder des tuyaux de tous les descripteurs de fichier (par exemple, il y a quelques applications, qui attendent de leurs parents pour ouvrir, dire fd 3 et 4, reliés à des tuyaux) et la plupart des shells directement en charge cette, trop (par exemple 1>,&3 rediriger stdout dans fd 3). Cependant, les indices de tableau pour
pipe(int fds[2])
sont 0 et 1, bien sûr. Je suis juste de le dire, parce que j'ai eu quelques-cargo culte-programmation étudiants, qui bêtement pris la cible fds aussi pour le tuyau syscall tableau.Attendre que tous les enfants de terminer l'utilisation
waitpid(-1, NULL, 0)
– je pense que c'est le -1 de ma pré-répondeur signifiait, ce qui signifie: Attendre que tous les processus enfants à la fin. L'autre option est d'appelerwait()
dans une boucle qui renvoie le pid du tout simplement résilié de l'enfant. Si on l'appelle à nouveau et il y a toujours un enfant en cours d'exécution, il permet de bloquer à nouveau. Si il n'y a pas d'enfant laissé, il sera de retour -1; je préfère lewaitpid
solution.Vous ne devez pas fermer stdin après qu'il a été remplacé par dup2(pipe_A[0], 0), car il serait de fermer le tube. Aussi, je ne vois pas pourquoi execv devrait bloquer. Cependant execv ne reviendra pas, il remplace le processus avec le programme. C'est pourquoi le processus est fourchue à l'avance. Sur quel système d'exploitation êtes-vous essayer cela? Juste curieux.
C'est un peu en retard, mais en regardant ce code, ne pas le subséquentes si-états-être "else if" à la place? Sinon, à la fois l'enfant et le parent de la première fourche exécuter la seconde.
Non, parce que
exec…
remplace le processus de l'image. Everthing après laexec…
dans le si l'instruction n'est pas exécutée.Bon point, j'ai oublié à ce sujet.
OriginalL'auteur datenwolf
Oui, c'est assez facile, il vous suffit de créer tous les tuyaux dans le parent, et n'oubliez pas de fermer les tuyaux /bouts de tuyaux dans le ou les enfant(s) que vous n'avez pas besoin d'eux.
Laissant FDs des canaux ouverts chez les enfants qui ne sont pas les utiliser c'est un ÉCHEC, car il peut apporter d'autres attendent toujours la fin de la pipe. Tous les écrivains doivent se fermer avant que le lecteur obtient un EOF.
OriginalL'auteur MarkR
Créer tous les tuyaux d'abord, puis générer tous les enfants les extrémités des tuyaux en FDs 0 et 1.
Comme pour l'attente, il suffit de garder en attente jusqu'à ce qu'elle retourne -1.
Continuez à l'appeler dans une boucle jusqu'à ce qu'elle retourne -1.
OriginalL'auteur Ignacio Vazquez-Abrams