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

| 特性 | FIFO (命名管道) | Pipe (無名管道) |
|---|---|---|
| 檔案系統實體 | 有,可 ls -l 看到 p 標誌 | 無,僅存在核心記憶體 |
| 存取方式 | 任意進程 open/read/write/close | 僅親緣進程透過 fd 繼承 |
| 生命週期 | 檔案刪除前持續存在 | 進程結束隨之消失 |
| 適用場景 | Client/Server、獨立守護進程通訊 | Shell 管線、親子進程簡單傳遞 |
$ mkfifo /tmp/myfifo
$ ls -l /tmp/myfifo
prw-r--r-- 1 user user 0 Jan 1 12:00 /tmp/myfifo
#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
# 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 會阻塞;設計時需避免死結。trap "rm -f /tmp/fifo" EXIT 清理。FIFO 以檔案介面統一進程通訊,簡單通用,是 Shell 腳本與輕量級 IPC 的首選。