反馈stdin和两个进程的stdout

时间:2012-03-13 17:59:54

标签: linux bash shell pipe sh

我有两个进程通过stdin和stdout相互连接。

假设我有进程A和进程B.B的stdout需要提供给A的stdin,而A的stdout需要提供给进程B的stdout。

有一种简单的方法可以在一个简单的命令中表达这种关系,还是有一个基本的shell脚本可以启用它?

提前致谢。

3 个答案:

答案 0 :(得分:5)

Bash 4 introduces coproc

declare -a FDS
coproc FDS { process_A; }
process_B <&${FDS[0]} >&${FDS[1]}

答案 1 :(得分:2)

看看named pipes。为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:当然,他们需要某种方式来识别双方都存在。像一个简单的“我在这里,是吗?”两者都收到回复。

重要提示:如下面的评论中所述,此过程将因两个程序阻止读取而死锁。必须采取某种形式的协调以确保不会发生这种情况。

答案 2 :(得分:0)

(我会评论Keith的答案,但还没有足够的代表。)

在OpenBSD上测试它,我发现无法通过运行来启动脚本:

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

atobbtoa是FIFO,脚本ab重复stdin)

但是,在对第二个进行后台处理之后,只要我在shell中运行> btoa(空命令,无论是打开btoa进行写入),它们就会启动。 (小心无限循环!)我想这意味着你需要第三个​​过程。

我不确定在这种情况下FIFO的行为(例如,多个进程是否开放)是否标准化。