在Linux中,管道是一种使用非常频繁的通信机制。从本质上说管道是一种让各个命令共享数据的一个文件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现为:
一、限制管道的大小。
实际上,管道是一个固定大小的缓冲区。在Linux中,该缓冲区的大小为1页,即4K字节,使得它的大小不象文件那样不加检验地增长。使用单个固定缓冲区也会带来问题,比如在写管道时可能变满,当这种情况发生时,随后对管道的write()调用将默认地被阻塞,等待某些数据被读取,以便腾出足够的空间供write()调用写。
二、读取进程也可能工作得比写进程快。
当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某些数据被写入,这解决了read()调用返回文件结束的问题。
注意:
1. 从管道读数据是一次性操作,数据一旦被读,它就从管道中被抛弃,释放空间以便写更多的数据。
2. 管道“|”只能处理由前面一个命令传来的正确信息,即 standard output,对于 standard error 不能处理。
3. 管道命令必须要能将接收到的 standard output 数据转换为 standard input数据。