管道是 Unix/Linux 最古老、最經典的進程間通信(IPC)機制,本質是內核維護的環形緩衝區,一端寫入、一端讀出,遵循先進先出(FIFO)原則。本文概述管道概念、分類、三種管道(偽管道 popen、匿名管道 pipe、命名管道 mkfifo)特性對比,為後續實戰篇鋪墊。
fcntl(F_SETPIPE_SZ) 調整)。| 維度 | 偽管道 popen()/pclose() | 匿名管道 pipe() | 命名管道 mkfifo() (FIFO) |
|---|---|---|---|
| 創建方式 | 啟動 Shell 執行命令 | 內核創建內存緩衝區 | 文件系統創建特殊文件 |
| 返回值 | FILE* 文件流指針 | 兩個文件描述符 fd[2] | 路徑名,後續用 open() 獲取 fd |
| 通信雙方 | 進程與 Shell 命令 | 親緣進程(父子/兄弟) | 任意知路徑進程 |
| 生命週期 | 隨 pclose 結束 | 隨最後引用進程退出銷毀 | 文件刪除前持久存在 |
| 性能 | 低(fork+exec Shell) | 高(純內核拷貝) | 高(同匿名管道) |
| 適用場景 | 執行命令捕獲輸出 | 父子進程高性能數據流 | 無親緣進程、守護進程通信 |
|env | grep bash
# 等價於:popen("env", "r") 讀取 → popen("grep bash", "w") 寫入
# Shell 自動創建匿名管道連接兩進程標準輸出/輸入
popen(簡單但啟動開銷大)。pipe + fork(零拷貝潛力、最輕量)。mkfifo(文件路徑會合、支持 select/poll/epoll 多路復用)。popen("env","r") 讀環境變量 → popen("grep bash","w") 過濾。pipe(fd) → 子進程 write(fd[1]) → 父進程 read(fd[0]) + wait() 同步。mkfifo("/tmp/fifo") → 父進程 open(O_RDONLY) 讀 → 子進程 open(O_WRONLY) 寫。管道是「內存中的文件」,以文件描述符/流為接口,以阻塞同步為協調。理解三種管道的創建方式、通信雙方約束、生命週期差異,是選擇正確 IPC 機制的前提。下三篇將逐個實戰演示。