我有两个进程通过stdin和stdout相互连接。
假设我有进程A和进程B.B的stdout需要提供给A的stdin,而A的stdout需要提供给进程B的stdout。
有一种简单的方法可以在一个简单的命令中表达这种关系,还是有一个基本的shell脚本可以启用它?
提前致谢。
答案 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
(atob
和btoa
是FIFO,脚本a
和b
重复stdin)
但是,在对第二个进行后台处理之后,只要我在shell中运行> btoa
(空命令,无论是打开btoa
进行写入),它们就会启动。 (小心无限循环!)我想这意味着你需要第三个过程。
我不确定在这种情况下FIFO的行为(例如,多个进程是否开放)是否标准化。