限制

  • 只能在具有亲缘关系的进程间使用

  • 历史上,都是半双工的

要点

  • 对管道写,不大于PIPE_BUF(/usr/include/linux/limits.h => 4K)时,可以保证不会与其他进程的写操作穿插(原子写)

与普通文件差异

  • 管道的缓冲区固定大小(4K),不会像文件一样无限增长

    • 当管道满时,调用write会被阻塞
    • 当管道空时,调用read也会被阻塞
  • 管道读是一次性的,一旦被读,就被丢弃

实现原理

在Linux中,管道的实现并没有使用专门的数据结构,而是借助了文件系统的file结构和VFS的索引节点inode。
通过将两个 file 结构指向同一个临时的 VFS 索引节点,而这个 VFS 索引节点又指向一个物理页面而实现的。

图中有两个 file 数据结构,但它们定义文件操作例程地址是不同的.
其中一个是向管道中写入数据的例程地址,而另一个是从管道中读出数据的例程地址。
这样,用户程序的系统调用仍然是通常的文件操作,而内核却利用这种抽象机制实现了管道这一特殊操作。

参考

  1. http://oss.org.cn/kernel-book/ch07/7.1.1.htm

留言

2015-08-05