7
votes

Commentaires STDIN et STDOUT DE DEUX PROCESSUS

J'ai deux processus qui se sont interfaces sur stdin et stdout.

Supposons que j'ai le processus A et le processus B. Le stdout de B doit se nourrir dans le stdinal d'A, et le stdout d'un besoin nécessaire de se nourrir de ce processus B.

Y a-t-il un moyen simple d'exprimer cette relation dans une simple commande ou existe-t-il un script de coque de base qui peut activer cela?

Merci d'avance.


0 commentaires

3 Réponses :


2
votes

Jetez un coup d'œil à Tipes nommés . Créez un tuyau pour A à B et un tuyau pour B à A. Ensuite, commencez-en à son stdouté redirigé vers le premier et son stdin redirigé vers la seconde. Ensuite, commencez b avec le contraire.

Il ressemblerait à ceci comme ceci: xxx

ajouter: bien sûr, ils auront besoin d'une certaine manière. reconnaître que les deux parties sont présentes. Quelque chose comme un simple "Je suis ici, n'est-ce pas?" qui reçoivent une réponse à.

important: Comme indiqué dans les commentaires ci-dessous, ce processus sera une impasse avec les deux programmes qui bloquent les lectures. Une forme de coordination sera nécessaire pour que cela ne se produise pas.


8 commentaires

Merci. Je suppose que chaque FIFO n'est pas trivialement petite, non? Telle que si le script ne les supprime pas, ce ne sera pas un problème. De plus, si un tuyau avec ce nom existe déjà, cela va-t-il simplement écraser?


Ils ne sont pas réellement des fichiers sur disque, juste des fichiers spéciaux dans le système de fichiers. Ils prennent 0 octets. En ce qui concerne l'écrasement, l'homme mkfifo dit que cela reviendra avec une erreur eexist


Ok, donc dans mon script, je m'assurerai simplement que je fais un RM -F sur chaque nom de FIFO avant de les créer.


Cela échappera probablement depuis que les processus n'attendront que l'entrée de chacun et que leurs lectures bloqueront, de sorte qu'ils n'obtiennent aucune chance de produire la sortie nécessaire de l'autre côté.


Cela fera presque certainement l'impasse et commander B ne sera même jamais exécuté. La coquille tentera de démarrer un et bloquera jusqu'à ce que chaque FIFO ait un processus attaché à l'autre côté. À tout le moins, la première commande doit être courante en arrière-plan.


Selon man mkfifo , "Cependant, il doit être ouvert aux deux extrémités simultanément avant de pouvoir procéder à toutes les opérations d'entrée ou de sortie. Ouvrir une FIFO pour la lecture Normalement bloque jusqu'à ce qu'un autre processus s'ouvre jusqu'à ce qu'un autre processus s'ouvre. la même FIFO pour écrire, et vice versa. "


Mon plan serait simplement d'ajouter un et suivant la ligne de départ Proc A


@Keith si une solution est possible dépend du plan de communication des applications. Si vous voulez juste que les deux applications dépendent de l'entrée de chacun, il y a une impasse par définition. Quelqu'un doit aller en premier et par exemple. Écrivez quelque chose avant qu'il ne tente de lire. Mais je n'ai pas de bonne idée de la façon de résoudre ce problème, même si nous avons cette information.



0
votes

(Je commenterais la réponse de Keith, mais je n'ai pas encore assez de réf.)

Testez ceci sur OpenBSD, j'ai trouvé impossible de démarrer les scripts en exécutant: P>

./a < btoa > atob &
./b < atob > btoa


0 commentaires

5
votes

1 commentaires

Juste quand je pensais avoir compris toutes les manipulations fd drôles que vous pouvez faire avec Bash ... +1.