Linux 201: Pipe


1. 原理

Pipe 原理

  • Pipe 是字节流。
  • Pipe 是半双工 (half duplex) 的,即字节流的方向是单向的。尽管一些操作系统也提供全双工 (full duplex) pipe,但为了可移植性,应当假设 pipe 支持单向信息流。
  • Pipe 信息之所以可以被不同进程共享,是因为信息存储在 kernel 里。

2. 使用方法

2.1. C 语言编程

#include <unistd.h>
int pipe(int filedes[2]); // Returns 0 on success, or –1 on error

2.2. 命令行

命令行中常用管道,即 |,连接两个进程的输入和输出。下图展示了ls | wc -l 命令的工作原理。
命令行管道原理

3. 用途:进程间通信 (Inter Process Communication, IPC)

Pipe 只能在有 公共祖先 的进程间共享信息,通常用法是父进程创建 pipe 并调用 fork 创建子进程,从而实现通过 pipe 共享信息

避免同时写同一个 pipe
如果父进程通过 pipe 向子进程发送数据,一般会关闭父进程的 read descriptor 和子进程的 write descriptor 以保证信息流的单向性。

父子进程 pipe 通信原理

如果需要双向通信 (bidirectional communication),一般会使用两个 pipe 负责不同方向的通信。

双管道双向通信

4. 参考资料

  1. The Linux Programming Interface
  2. The Unix Programming Environment

文章作者: Shane Tsui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Shane Tsui !

  目录