0

我在理解此命令时遇到问题:在终端执行mkfifo pipe1mkfifo pipe2 执行后:

  1. $ echo -n x | cat - pipe1 > pipe2 &

    结果我得到:

    [1] 3526
    

    随着时间的推移往往会增加的数字。

    当我运行时:

  2. $ cat <pipe2 > pipe1

    输出是:

    $ echo -n x | cat - pipe1 > pipe2 &
    

有人可以解释发生了什么吗?

  1. 据我所知,第一个命令应该在 pipe2 上创建一个包含 x + pipe1 内容的新文件,那么输出是什么,如果 pipe2 已经存在,因为是用 mkfifo 创建的,那么应该发生什么?
  2. 我不知道第二个命令是做什么的。我在网上找不到任何参考资料。

这是作业,我们还没有看到课;任何帮助,将不胜感激。

4

1 回答 1

5

每个命令:

echo -n x | cat - pipe1 > pipe2 &

运行命令序列,以便将 的输出通过echo管道传送到,cat但该序列在后台运行。shell 会生成一条消息,例如:

[1] 3526

表示后台作业是 jobid 1 和进程 ID 3526。由于 FIFO 的性质,整个子 shell 被挂起,等待打开pipe2读取的内容,然后才能成功启动cat操作。一旦发布,该cat命令从标准输入读取一个字符,然后挂起等待来自pipe1. 严格地说,这意味着它等待一个进程打开pipe2以进行写入。

当您重复该命令时,数字会增加,因为作业编号和进程 ID 是唯一的。

cat pipe1本身应该挂起。回显的命令可能来自之前完成的某个命令。

$ echo -n x | cat - pipe1 > pipe2 &
[1] 9304
$ (echo Hi > pipe1) &
[2] 9305
$ sleep 3
$ jobs
[1]-  Running                 echo -n x | cat - pipe1 > pipe2 &
[2]+  Running                 ( echo Hi > pipe1 ) &
$ cat pipe2
-n x
Hi
[1]-  Done                    echo -n x | cat - pipe1 > pipe2
[2]+  Done                    ( echo Hi > pipe1 )
$

我的外壳(Korn)echo -n与您的外壳(可能bash)不同。

于 2012-11-24T03:45:49.043 回答