linux-管道
限制
只能在具有亲缘关系的进程间使用
历史上,都是半双工的
要点
- 对管道写,不大于PIPE_BUF(
/usr/include/linux/limits.h
=> 4K)时,可以保证不会与其他进程的写操作穿插(原子写)
与普通文件差异
管道的缓冲区固定大小(4K),不会像文件一样无限增长
- 当管道满时,调用write会被阻塞
- 当管道空时,调用read也会被阻塞
管道读是一次性的,一旦被读,就被丢弃
实现原理
在Linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。
通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。
图中有两个 file 数据结构,但它们定义文件操作例程地址是不同的.
其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。
这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。