使用“cat”命令在管道之间传递字符

3

我一直在研究Linux中的管道,我在一本书(http://linux-training.be/linuxsys.pdf,第16页)中发现了这个内容。

首先他们使用mkfifo创建了四个管道。

$ mkfifo pipe33a pipe33b pipe42a pipe42b

将 /bin/cat 复制到 ./ 目录下

$ cp /bin/cat proj33 && cp /bin/cat proj42

接着运行以下命令:

$ echo -n x | ./proj33 - pipe33a > pipe33b
$ ./proj33 <pipe33b >pipe33a &

这本书将最后的命令解释为:

你看到的这些命令将创建两个使用cat的proj33进程,用于在pipe33a和pipe33b之间反弹字符x。

我的问题是我不理解最后一个命令。特别是为什么在./proj33和pipe33a之间使用'-'?'-'有什么作用?而且这个设置如何像无限循环一样交换字符“x”?

3
通常情况下,“-”代表标准输入或输出,具体取决于上下文。例如,echo 1 | cat file - > file.out 将把标准输入附加到来自 file 的内容中,并将结果写入 file.out;而 cat - file 则先读取标准输入。 - Andreas Louv
2个回答

5

解释: 为了更清晰地说明,我将把进程proj33称为cat1和cat2。

  1. echo -n x输出字符'x'并将其传递给cat1,它只是cat命令的一个副本。
  2. cat1 - pipe33a > pipe33b:首先读取stdin(这就是-的含义),并将其写入pipe33b。然后,cat1尝试从pipe33a读取,并且必须等待。
  3. cat2 <pipe33b >pipe33a &pipe33b中读出'x',并将其写回pipe33a
  4. 现在,cat1可以从pipe33a中读取'x',并将其写回pipe33b,从而重新启动整个过程。

2
“它必须等待”,关键词!感谢epicbrew!在第一个命令(cat1)之后,在cat2之前,我还尝试了ps aux|grep $cat1pid,结果它处于睡眠状态。在我运行第二个命令之后,它开始运行。 - raghulmz

2
命令中的-表示cat(或您的副本proj33)从标准输入读取。因此,proj33将标准输入和pipe33a的内容连接起来,并将它们发送到pipe33b
第二个proj33实例从pipe33b(即第一个实例的输出)读取并将输出发送到pipe33a(即返回到第一个实例)。
第一个命令中的-是必需的,以启动该过程,允许您将一个字符输入循环中的echo

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