Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 两个过程的反馈stdin和stdout_Linux_Bash_Shell_Pipe_Sh - Fatal编程技术网

Linux 两个过程的反馈stdin和stdout

Linux 两个过程的反馈stdin和stdout,linux,bash,shell,pipe,sh,Linux,Bash,Shell,Pipe,Sh,我有两个进程通过stdin和stdout相互连接 假设我有进程A和进程B,B的stdout需要输入A的stdin,A的stdout需要输入进程B的stdin 是否有一种简单的方法可以在一个简单的命令中表达这种关系,或者是否有一个基本的shell脚本可以实现这一点 提前谢谢。看一看。为A到B创建一个管道,为B到A创建一个管道。然后启动A,使其标准输出重定向到第一个,标准输入重定向到第二个。然后从相反的B开始 它看起来像这样: mkfifo --mode=0666 /tmp/AtoB mkfifo

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

假设我有进程A和进程B,B的stdout需要输入A的stdin,A的stdout需要输入进程B的stdin

是否有一种简单的方法可以在一个简单的命令中表达这种关系,或者是否有一个基本的shell脚本可以实现这一点

提前谢谢。

看一看。为A到B创建一个管道,为B到A创建一个管道。然后启动A,使其标准输出重定向到第一个,标准输入重定向到第二个。然后从相反的B开始

它看起来像这样:

mkfifo --mode=0666 /tmp/AtoB
mkfifo --mode=0666 /tmp/BtoA
A < BtoA > AtoB
B < AtoB > BtoA
mkfifo--mode=0666/tmp/AtoB
mkfifo——模式=0666/tmp/BtoA
AAtoB
BBtoA
补充:当然,他们需要某种方式来认识到双方都在场。类似于一个简单的“我在这里,你在吗?”这两个词都会得到回应

重要提示:如下面的注释所述,此过程将因两个程序都阻塞读取而死锁。需要某种形式的协调来确保这种情况不会发生。

(我会对基思的回答发表评论,但还没有足够的代表。)

在OpenBSD上测试时,我发现不可能通过运行以下命令来启动脚本:

./a < btoa > atob &
./b < atob > btoa
/aatob&
/bbtoa
atob
btoa
为先进先出,脚本
a
b
复制标准输入法)

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

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

Bash 4:

declare-a FDS
coproc FDS{process_A;}
进程&${FDS[1]}

谢谢。我想每个fifo都很小,对吗?这样,如果脚本不删除它们,就不会有问题。另外,如果已经存在同名的管道,它会覆盖它吗?它们实际上不是磁盘上的文件,只是文件系统中的特殊文件。它们占用0字节。关于覆盖,man mkfifo说它将返回一个错误EEXISTOk,因此在我的脚本中,我将确保在创建每个fifo名称之前对它们执行rm-f。这可能会死锁,因为进程将只等待彼此的输入,并且它们的读取将被阻塞,所以他们没有机会产生另一方所需的输出,这几乎肯定会导致死锁,命令B甚至永远不会执行。shell将尝试启动一个进程,并将阻塞,直到每个fifo都有一个进程连接到另一侧。至少,第一个命令必须在后台运行。正当我认为我理解了所有可以用bash进行的有趣的fd操作时+1.
declare -a FDS
coproc FDS { process_A; }
process_B <&${FDS[0]} >&${FDS[1]}