Unix cat命令和FIFO

时间:2012-11-24 03:09:40

标签: unix console

我在理解这些命令时遇到问题: 在终端mkfifo pipe1mkfifo pipe2完成后 并执行:

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

    我得到了结果:

    [1] 3526
    

    通过时间往往会增加的数字。

    当我跑步时:

  2. $ cat <pipe2 > pipe1

    输出是:

    $ echo -n x | cat - pipe1 > pipe2 &
    
  3. 有人可以解释发生什么事吗?

    1. 据我所知,第一个命令应该在pipe2上创建一个带有x + pipe1内容的新文件然后是什么输出,如果pipe2已经存在,因为是用mkfifo创建的,那么会发生什么?
    2. 我不知道第二个命令是做什么的。我在网上找不到任何参考资料。
    3. 这是一个家庭作业,我们还没有看过课程;任何帮助将不胜感激。

1 个答案:

答案 0 :(得分: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 )
$

我的shell(Korn)不会解释echo -n与您的相同(可能是bash)。