Bash 命名管道详解

在大多数类似 Unix 的操作系统中,有可能创建一种特殊类型的文件,叫做命名管道。命名管道用来在 两个进程之间建立连接,也可以像其它类型的文件一样使用。

命令管道的行为类似于文件,但实际上形成了先入先出(FIFO)的缓冲。和普通(未命令的)管道一样, 数据从一端进入,然后从另一端出现。通过命令管道,有可能像这样设置一些东西:

process1 > named_pipe

process2 < named_pipe

表现出来就像这样:

process1 | process2

设置一个命名管道

使用 mkfifo 命令能够创建命令管道:

$ mkfifo pipe1
$ ls -l pipe1
prw-r--r-- 1 me me 0 2009-07-17 06:41 pipe1

这里我们使用 mkfifo 创建了一个名为 pipe1 的命名管道。使用 ls 命令,我们查看这个文件, 看到位于属性字段的第一个字母是 “p”,表明它是一个命名管道。

使用命名管道

为了演示命名管道是如何工作的,我们将需要两个终端窗口(或用两个虚拟控制台代替)。 在第一个终端中,我们输入一个简单命令,并把命令的输出重定向到命名管道:

$ ls -l > pipe1

我们按下 Enter 按键之后,命令将会挂起。这是因为在管道的另一端没有任何接受数据。当这种现象发生的时候, 据说是管道阻塞了。一旦我们绑定一个进程到管道的另一端,该进程开始从管道中读取输入的时候,这种情况会消失。 使用第二个终端窗口,我们输入这个命令。

$ cat < pipe1

然后产自第一个终端窗口的目录列表出现在第二个终端中,并作为来自 cat 命令的输出。在第一个终端 窗口中的 ls 命令一旦它不再阻塞,会成功地结束。

教程来源于Github,感谢大佬的无私奉献,致敬!

技术教程推荐

赵成的运维体系管理课 -〔赵成〕

从0开始学微服务 -〔胡忠想〕

黄勇的OKR实战笔记 -〔黄勇〕

微信小程序全栈开发实战 -〔李艺〕

乔新亮的CTO成长复盘 -〔乔新亮〕

流程型组织15讲 -〔蒋伟良〕

容量保障核心技术与实战 -〔吴骏龙〕

Go 语言项目开发实战 -〔孔令飞〕

Python实战 · 从0到1搭建直播视频平台 -〔Barry〕