匿名管道:
概述:
用于Unix系列系统。单向数据通道,写端写的数据在被读端读取之前会被操作系统缓存。双向管道需要通过创建两个单向管道实现
之所以是匿名的。是因为匿名管道不存在于文件系统中,随着使用它的进程结束而结束,没有名称。没有特别指明的话,管道指匿名管道。
管道为多个文件创建了临时的直接连接,这使得整合起来的管道整体性能比各个程序分别运行要高。这种直接连接使得程序可以同时运行,并且允许数据直接在它们之间连续的传输而不必将数据传到临时文件中或是显示器上然后等待前一个程序执行完后一个才可以执行。如果写入程序写的快于读取程序,写入程序就会被阻塞并等待数据被读取;相反的,读取程序就会被阻塞等待数据被写入(如果设置为阻塞读写的话)。
文件描述符:当打开文件之后,系统会为其维护一个描述文件的实体,相应的,这个实体会有一个整数作为其描述符,通过这个整数就可以访问这个文件描述实体。所以在通过文件描述符使用文件的功能中,可以通过改变文件描述符实际指向的内容来实现输入输出流的改变。使用fopen()返回的文件结构体struct FILE(即struct _IO_FILE)中的_fileno字段表示文件描述符。文件描述符0/1/2分别为标准输入输出错误流,所以新打开的文件会从3开始使用并随着打开的文件增长
在程序中使用管道
Unix系列系统通过pipe()函数创建新的管道。包含在头文件unistd.h中。原型:int pipe(int filedes[2]);
返回值:成功返回0,失败返回-1
参数:一个2个元素的文件描述符数组,成功创建的话,函数将在其中分别放置读端(filedes[0])和写端(filedes[1])
read()向写端写,read()向读端读。参数为文件描述符、存放位置、读/写大小。默认情况下读取是阻塞的,只要有写端是打开的,就会一致阻塞地等待需要的数据
从管道中读取:
读取时 管道中 字节数(p) |
至少有一个进程有打开的写端 | 没有进程有打开的写端 | ||
阻塞读 | 非阻塞读 | |||