管道的概念、地位及应用

解增言

2020-04-10 11:11

管道可以说是Linux下最重要的概念之一,也是Linux的灵魂所在。如果能理解并熟练使用管道,那么Linux也就学会了一大半。

管道是一种两个进程间进行单向通信的机制,它可以把上一个命令的输出传递给下一个命令,作为下一个命令的输入。管道的符号是“|”(看起来确实像个管子)。

有了管道,用户就可以按照自己的需要,将不同的命令(包括其选项)组合起来,完成在Windows下编程才能实现的任务。管道使得Linux成为一个开放的系统,系统提供了一个框架,而用户在该框架下可以自由发挥创造。

没有完美的人,但是有完美的团队。一个命令不可能完成所有工作,但把多个命令组合起来,可以完成大多数任务。

我们用下图来说明管道的工作机制。我们把数据看成是含有杂质需要过滤的水,命令看成管道中的过滤器,就像自来水经过几层过滤变成纯净水一样,原始数据经过管道中的命令处理,变成我们需要的数据后输出。

Pipe Diagram

把上面图中的步骤分拆开会更清楚一些:

$ cat input.txt
dog     4
cat     8
mouse   5
cat     2
rabbit  3
$ cat input.txt | cut -f1
dog
cat
mouse
cat
rabbit
$ cat input.txt | cut -f1 | sort
cat
cat
dog
mouse
rabbit
$ cat input.txt | cut -f1 | sort | uniq
cat
dog
mouse
rabbit

每用管道连上一个命令后,检查输出,如果没有问题,再添加下一个命令,最后把数据处理成自己需要的内容和格式。

Linux的管道用于进程间的通信,分为无名管道(unnamed pipe)和有名管道(named pipe)。无名管道即上面所讲的管道,用来连接两个命令。有名管道又称命名管道、管道文件或FIFO文件(first in first out,先进先出,与数据结构中的队列类似),如/dev/initctl。管道文件在文件属性中的文件类型一列中显示为p,可用mkfifo命令创建,rm命令删除。管道文件可用来在两个进程间传递数据。

$ ls -l
总用量 8
-rw-rw-r-- 1 xiezy xiezy 35  4月 10 12:54 input.txt
-rw-rw-r-- 1 xiezy xiezy 21  4月 10 12:56 output.txt
$ mkfifo pipe_demo
$ ls -l
总用量 8
-rw-rw-r-- 1 xiezy xiezy 35  4月 10 12:54 input.txt
-rw-rw-r-- 1 xiezy xiezy 21  4月 10 12:56 output.txt
prw-rw-r-- 1 xiezy xiezy  0  4月 10 13:20 pipe_demo