两个进程的反馈stdin和stdout

10
我有两个进程,它们通过标准输入和标准输出进行交互。
假设我有进程 A 和进程 B。B 的标准输出需要输入到 A 的标准输入中,而 A 的标准输出也需要输入到 B 的标准输入中。
是否有一种简单的方法可以在一个命令中表达这种关系?或者是否有一个基本的 shell 脚本可以实现这个功能?
谢谢您提前的帮助。
3个回答

6

Bash 4 介绍coproc

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

2
就在我认为我已经理解了所有可以在Bash中使用的有趣的fd操作时...+1。 - je4d
你能详细说明一下吗?文档中的示例并不直观。我认为我们可以从这里提供一个简单的示例,并提供每个输入/输出连接的信息。stdin和stdout是否双向连接,镜像? - user

2

看一下命名管道。为A到B和B到A各创建一个管道,然后启动A并将其标准输出重定向到第一个管道,将其标准输入重定向到第二个管道。接着启动B并执行相反的操作。

看起来会像这样:

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

添加:当然,他们需要一种方式来识别双方是否都在场。可以使用类似于“我在这里,你在吗?”的简单消息,并确保双方都能收到回复。

重要提示:如下方评论所述,这个过程可能会因为两个程序都在读取数据而导致死锁。为了避免这种情况发生,需要进行某种形式的协调。


1
它们实际上不是磁盘上的文件,而只是文件系统中的特殊文件。它们占用0字节。关于覆盖,mkfifo手册中说它会返回一个EEXIST错误。 - user530229
好的,在我的脚本中,我会确保在创建它们之前对每个FIFO名称进行rm -f操作。 - Bill
这可能会发生死锁,因为进程只会等待彼此的输入,并且它们的读取将被阻塞,因此它们没有机会产生另一方所需的输出。 - Michał Kosmulski
根据man mkfifo的说明,“但是,在您可以继续执行任何输入或输出操作之前,它必须同时在两端打开。为读取打开FIFO通常会阻塞,直到某个其他进程为写入打开相同的FIFO,反之亦然。” - user530229
我的计划很简单,只需在以proc A开头的行后面添加一个&符号。 - Bill
显示剩余3条评论

0
(我想评论Keith的答案,但是还没有足够的声望。)
在OpenBSD上测试时,我发现无法通过运行以下命令来启动脚本:
./a < btoa > atob &
./b < atob > btoa

atobbtoa是FIFO,脚本ab复制标准输入)

然而,在将第二个后台化之后,当我在shell中运行> btoa(空命令,但打开btoa进行写入)时,它们开始了。(注意无限循环!)我想这意味着你需要第三个进程。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接