首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言進程間通信:管道機制概述與三種管道對比

     編輯:關於C

管道是 Unix/Linux 最古老、最經典的進程間通信(IPC)機制,本質是內核維護的環形緩衝區,一端寫入、一端讀出,遵循先進先出(FIFO)原則。本文概述管道概念、分類、三種管道(偽管道 popen、匿名管道 pipe、命名管道 mkfifo)特性對比,為後續實戰篇鋪墊。

管道核心特性

  • 半雙工:數據單向流動,雙向需建兩個管道。
  • 字節流:無消息邊界,讀寫任意字節數。
  • 阻塞語義:讀空阻塞、寫滿阻塞、讀端關閉寫端收 SIGPIPE、寫端關閉讀端讀到 EOF。
  • 內核緩衝:默認 64KB(可通過 fcntl(F_SETPIPE_SZ) 調整)。

三種管道詳細對比

維度偽管道 popen()/pclose()匿名管道 pipe()命名管道 mkfifo() (FIFO)
創建方式啟動 Shell 執行命令內核創建內存緩衝區文件系統創建特殊文件
返回值FILE* 文件流指針兩個文件描述符 fd[2]路徑名,後續用 open() 獲取 fd
通信雙方進程與 Shell 命令親緣進程(父子/兄弟)任意知路徑進程
生命週期隨 pclose 結束隨最後引用進程退出銷毀文件刪除前持久存在
性能低(fork+exec Shell)高(純內核拷貝)高(同匿名管道)
適用場景執行命令捕獲輸出父子進程高性能數據流無親緣進程、守護進程通信

Shell 中的管道符 |

env | grep bash
# 等價於:popen("env", "r") 讀取 → popen("grep bash", "w") 寫入
# Shell 自動創建匿名管道連接兩進程標準輸出/輸入

選擇指南

  1. 需調用外部命令並獲取輸出 → popen(簡單但啟動開銷大)。
  2. 父子進程高頻數據交換 → pipe + fork(零拷貝潛力、最輕量)。
  3. 無親緣進程/守護進程通信 → 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 機制的前提。下三篇將逐個實戰演示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved