Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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 使用cat在管道之间反弹角色_Linux_Bash_Shell_Unix_Pipe - Fatal编程技术网

Linux 使用cat在管道之间反弹角色

Linux 使用cat在管道之间反弹角色,linux,bash,shell,unix,pipe,Linux,Bash,Shell,Unix,Pipe,我一直在读linux中的管道,我在一本书(第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 >pipe3

我一直在读linux中的管道,我在一本书(第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 &
$echo-nx |/proj33-pipe33a>pipe33b
美元/项目33管道33A&
本书将最后一个命令解释为

上面看到的命令将创建两个使用 cat在pipe33a和pipe33b之间反弹x字符


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

命令中的
-
意味着
cat
(或您的副本,
proj33
)从标准输入读取。因此
proj33
将标准输入和
pipe33a
的内容连接起来,发送到
pipe33b

proj33
的第二个实例读取
pipe33b
(即第一个实例的输出),并将输出发送到
pipe33a
(即返回第一个实例)

第一个命令中的
-
用于启动流程,允许您将
字符回送到循环中。

说明: 注意:为了清楚起见,我将调用进程cat1和cat2,而不是proj33

  • echo-nx
    输出字符“x”并将其馈送到
    cat1
    ,这只是cat命令的副本
  • cat1-pipe33a>pipe33b
    :首先读取stdin(这就是
    -
    的意思)并将其写入
    pipe33b
    。然后cat1尝试从
    pipe33a
    读取数据,它必须等待
  • cat2-pipe33a&
    pipe33b
    中读取“x”,并将其写回
    pipe33a
  • cat1现在可以从
    pipe33a
    读取“x”,并将其写入
    pipe33b
    重新开始整个过程

  • -
    通常是指依赖于上下文的标准输入或输出,例如
    echo 1 | cat file->file.out
    将标准输入附加到
    file
    中的内容,并将其写入
    file.out
    ,而
    cat-file
    将首先接受标准输入。“它必须等待”,关键字!谢谢你!。在第一个命令(cat1)之后和cat2之前,我也尝试了
    ps aux | grep$cat1pid
    ,它处于睡眠状态。在我运行第二个命令后,它开始运行。