Chinaunix首页 | 论坛 | 博客
  • 博客访问: 400078
  • 博文数量: 103
  • 博客积分: 3073
  • 博客等级: 中校
  • 技术积分: 1078
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-23 15:04
文章分类

全部博文(103)

文章存档

2012年(13)

2011年(76)

2010年(14)

分类: LINUX

2011-09-22 23:29:06

匿名”管道和命名管道

前面管道的例子不但非常有趣,而且还形象地描述了链接的概念,接下来我们就回过头来在研究一下它。当您在命令行模式下使用管道时, shell 创建管道并以如下方式对其进行操作:管道之前的命令写入管道,而管道之后的命令从管道里读取信息。所有管道,不论匿名的 (像在 shell 里使用的)还是命名的 (见下文) 都是 FIFO 的 (先进先出)。虽然我们已经提供了如何在 shell 中使用它们的例子,但是为了说明问题,我们来看另外一个例子。

$ ls -d /proc/[0-9] | head -5 /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/

您可能没有注意到(因为它发生得太快以至于您很难观察到它),在这个例子中,写入是可以堵塞的。这意味着当 ls 命令写入管道的时候,堵塞会持续到管道另一端的过程从管道中读取数据。为了形象化说明这个效果,我们可以建立命名管道。它不像在 shell 中使用的那样,而是有名字的(比如它们是被链接的,而在 shell 中它们并不是).[].命名管道由命令 mkfifo 创建:

$ mkfifo a_pipe $ ls -il total 0 169 prw-rw-r-- 1 zhang zhang 0 Dec 10 14:12 a_pipe| # # You can see that the link counter is 1, and that the output shows # that the file is a pipe ('p'). # # You can also use ln here: # $ ln a_pipe the_same_pipe $ ls -il total 0 169 prw-rw-r-- 2 zhang zhang 0 Dec 10 15:37 a_pipe| 169 prw-rw-r-- 2 zhang zhang 0 Dec 10 15:37 the_same_pipe| $ ls -d /proc/[0-9] >a_pipe # # The process is blocked, as there is no reader at the other end. # Type Control Z to suspend the process... # zsh: 3452 suspended ls -d /proc/[0-9] > a_pipe # # ...Then put in into the background: # $ bg [1] + continued ls -d /proc/[0-9] > a_pipe # # now read from the pipe... # $ head -5 a_pipe /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/ #

类似地,读取也是可以堵塞的。如果以相反的顺序执行以上命令,我们将看到 head 被阻塞并等待一些过程提供读取的数据。

$ head -5 the_same_pipe $ /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/ [1] + 741 done head -5 < a_pipe $

您也可以在前面的例子里看到一个我们并不愿意引入的效果: ls 命令在head 命令夺取控制权之前就终止了。这样的结果就是您立即回到了提示符状态,但是 head 会在之后执行,您只能返回到提示符状态之后看到它的结果。



阅读(3440) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~