萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux FIFO 命名管道建立與進程間通訊完整教學

FIFO(First-In-First-Out),又稱命名管道,是一種特殊檔案類型,擁有檔案系統路徑與 inode,允許無親緣關係的進程雙向通訊,解決無名管道僅限父子/兄弟進程的限制。

FIFO 檔案屬性

FIFO vs 無名管道

特性FIFO (命名管道)Pipe (無名管道)
檔案系統實體有,可 ls -l 看到 p 標誌無,僅存在核心記憶體
存取方式任意進程 open/read/write/close僅親緣進程透過 fd 繼承
生命週期檔案刪除前持續存在進程結束隨之消失
適用場景Client/Server、獨立守護進程通訊Shell 管線、親子進程簡單傳遞

建立 FIFO 的方法

Shell 命令列

$ mkfifo /tmp/myfifo
$ ls -l /tmp/myfifo
prw-r--r-- 1 user user 0 Jan 1 12:00 /tmp/myfifo

C 程式介面

#include 
#include 
#include 
#include 

mode_t old = umask(0);
unlink("/tmp/myfifo");           // 確保不存在
mkfifo("/tmp/myfifo", 0666);     // 建立,權限 0666
umask(old);

// 或使用 mknod
mknod("/tmp/myfifo", S_IFIFO | 0666, 0);

讀寫操作與阻塞特性

  • open() 預設阻塞:O_RDONLY 等待寫入端開啟;O_WRONLY 等待讀取端開啟。
  • 非阻塞模式:O_NONBLOCK,讀端立即返回,寫端無讀者時收到 SIGPIPE 或 EPIPE。
  • 單次寫入 PIPE_BUF(POSIX 保證 ≥ 512 bytes,Linux 4096 bytes)內資料為原子操作,不會交錯。

典型應用模式

生產者/消費者

# 終端機 1(消費者)
$ cat /tmp/myfifo

# 終端機 2(生產者)
$ echo "hello" > /tmp/myfifo
$ cat large_file > /tmp/myfifo

Client/Server 架構

# Server 持續監聽
while true; do
  cat /tmp/server_fifo | while read cmd; do
    process "$cmd" > /tmp/client_fifo_$client_pid
  done
done

# Client 發送請求並讀取回應
echo "request_data" > /tmp/server_fifo
cat /tmp/client_fifo_$$

注意事項

  • 讀寫端至少一方開啟前,另一方 open 會阻塞;設計時需避免死結。
  • 進程異常終止未關閉 fd,管道仍殘留,建議搭配 trap "rm -f /tmp/fifo" EXIT 清理。
  • 高效能場景考慮 Unix Domain Socket(支援雙向、傳遞 fd、封包邊界)。

FIFO 以檔案介面統一進程通訊,簡單通用,是 Shell 腳本與輕量級 IPC 的首選。

copyright © 萬盛學電腦網 all rights reserved