今天上课老师具体讲了管道在UNIX中的作用以及实现原理,自己下来琢磨了好一阵子,基本上搞清楚了,赶紧记在小本本上。
管道是什么
首先来看一个命令:
cat file1 file2 | sort
cat表示读取file1、file2中的数据,然后使用管道 |
,将这些内容作为输入,使用sort函数作为输出,最后输出在屏幕上。
管道做了什么事
熟悉类UNIX系统的朋友一定经常使用管道,其实它就是用来做进程通讯的。我们很多时候需要将一个文件中的内容作为另一个文件的输入,或者将一个程序运行的结果作为另一个程序的输入,这时候管道就派上用场了。我们这里先只考虑无名管道。
无名管道
- 只能用于具有亲缘关系的进程之间,父子进程,兄弟进程之间通信,因为只有子进程才能继续父进程的文件描述符。
- 半双共通信(同一时刻只能对管道进行一种操作(读操作或者写操作)),具有读端口和写端口。
- 管道是一种特殊的文件,可以使用文件I/O函数(read,write…)来操作,但不能使用lseek函数来定位操作。
- 管道是在内存中,不用我们主动去删除。
- 管道是基于队列实现的,有大小限制。
管道实现原理
相关概念与函数
文件描述符(File Descriptor)
对于内核而言,所有打开文件都是由文件描述符引用。文件描述符(fd)是一个非负整数。
当打开一个现存文件或者创建一个新文件时,内核向进程返回一个文件描述符。fd可以理解为一个文件的标识,系统调用中的open
和creat
都返回fd,并将其作为参数传给read
或write
。
通常情况,UNIX shell**使文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准出错输出相结合**。
因此,文件描述符可以看成是文件描述符表的一个下标,我们可以通过这个fd访问文件的信息(fstate
),也可以使用write
或read
对文件进行修改,具体细节可参考