stdin обратной связи и stdout двух процессов - PullRequest
6 голосов
/ 13 марта 2012

У меня есть два процесса, которые взаимодействуют друг с другом через stdin и stdout.

Предположим, у меня есть процесс A и процесс B. Стандартный вывод B должен быть подключен к стандартному выводу A и стандартный вывод Aнеобходимо ввести данные процесса B.

Есть ли простой способ выразить это отношение с помощью простой команды или есть базовый сценарий оболочки, который может включить это?

Спасибо ввперед.

Ответы [ 3 ]

5 голосов
/ 15 марта 2012

Bash 4 вводит coproc:

declare -a FDS
coproc FDS { process_A; }
process_B <&${FDS[0]} >&${FDS[1]}
2 голосов
/ 13 марта 2012

Взгляните на именованные каналы . Создайте одну трубу для A до B и одну трубу для B до A. Затем запустите A с его stdout, перенаправленным на первый, и его stdin, перенаправленным на второй. Затем начните B с противоположного.

Это будет выглядеть примерно так:

mkfifo --mode=0666 /tmp/AtoB
mkfifo --mode=0666 /tmp/BtoA
A < BtoA > AtoB
B < AtoB > BtoA

add: Конечно, им понадобится какой-то способ признать, что присутствуют обе стороны. Что-то вроде простого "Я здесь, а ты?" что оба получают ответ.

Важное замечание: Как отмечено в комментариях ниже, этот процесс блокируется при чтении обеих программ. Для того, чтобы этого не произошло, потребуется некоторая форма координации.

0 голосов
/ 15 марта 2012

(Я бы прокомментировал ответ Кейта, но у меня еще недостаточно представителей.)

Тестируя это на OpenBSD, я обнаружил, что невозможно запустить сценарии, выполнив:

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

(atob и btoa являются FIFO, а сценарии a и b дублируют стандартный ввод)

Однако, после того, как я также задал второй фон, как только я запустил > btoa вмоя оболочка (пустая команда, однако открывающая btoa для записи), они запустились.(Остерегайтесь бесконечного цикла!) Я думаю, это означает, что вам нужен третий процесс.

Я не уверен, что поведение FIFO в таких случаях (например, открытие нескольких процессов для записи)стандартизирован.

...