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

Linux 進程間通信:管道與有名管道(FIFO)深度解析

     編輯:關於C語言

進程間通信(IPC)是系統編程的核心課題。管道和 FIFO 作為最經典的 IPC 機制,雖然簡單但極其強大,是 Unix 哲學「一切皆文件」的典型體現。

無名管道

管道提供單向數據流,適用於具有親緣關係的進程(通常是父子進程)。

創建與使用

#include <unistd.h>
int pipe(int fd[2]);

成功返回 0,fd[0] 為讀端,fd[1] 為寫端。配合 read()/write() 實現數據傳輸。

典型模式:父子進程通信

  1. 父進程調用 pipe() 創建管道
  2. 調用 fork() 創建子進程
  3. 父進程關閉讀端(fd[0]),子進程關閉寫端(fd[1])
  4. 形成單向數據流:父寫子讀 或 子寫父讀

雙向通信

需要創建兩個管道,分別處理兩個方向的數據流。

有名管道

FIFO 突破了親緣關係限制,通過文件系統路徑名訪問,允許無關進程通信。

創建與打開

#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char *pathname, mode_t mode);

mode 定義權限,常用組合:

  • S_IRUSR | S_IWUSR — 用戶讀寫
  • S_IRGRP | S_IWGRP — 組讀寫
  • S_IROTH | S_IWOTH — 其他讀寫

常見定義:#define FIFO_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)

使用示例

#define FIFO1 "/tmp/fifo.1"
#define FIFO2 "/tmp/fifo.2"

mkfifo(FIFO1, FIFO_MODE);
mkfifo(FIFO2, FIFO_MODE);

if (fork() == 0) { // 子進程
    int rd = open(FIFO1, O_RDONLY);
    int wr = open(FIFO2, O_WRONLY);
    // 通信邏輯...
}

管道 vs FIFO 對比

特性管道FIFO
訪問方式文件描述符路徑名
進程關係需親緣關係無關進程可用
生命週期隨進程結束銷毀文件系統持久存在
適用場景父子進程高速通信任意進程間通信

最佳實踐建議

  • 管道適用於高性能、短生命週期的父子進程通信
  • FIFO 適合服務器-客戶端架構、守護進程通信
  • 注意處理 SIGPIPE 信號,避免寫端斷開導致進程終止
  • 大數據傳輸考慮使用 splice()/tee() 零拷貝技術

理解管道與 FIFO 的異同,能幫助你在系統編程中選擇最合適的 IPC 機制,構建高效穩健的並發應用。

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