進程間通信(IPC,Inter-Process Communication)是多進程協作的基石。每個進程擁有獨立地址空間,若需共享數據或協同完成任務,必須通過內核提供的 IPC 機制。本文概述 IPC 核心動機、三大核心問題、同步與互斥基礎,為後續具體機制(管道、信號、共享內存、消息隊列、Socket)鋪墊。
// 進程 A
int main() { int a = 3; printf("%d\n", a); return 0; }
// 進程 B
int main() { int b = 3; printf("%d\n", b); printf("%d\n", a); // 編譯錯誤:a 不可見 }
進程隔離導致變量不可直接訪問,必須通過 IPC 交換數據。
| 問題 | 描述 | 典型解決機制 | |
|---|---|---|---|
| 1. 進程如何通信 | 數據如何從一個進程流向另一個 | 管道、FIFO、消息隊列、共享內存、Socket、信號 | |
| 2. 如何使用臨界資源 | 多進程訪問共享資源(文件、內存、硬件)不衝突 | 信號量、文件鎖、互斥鎖(進程間)、Peterson 算法 | |
| 3. 如何有序執行任務 | 協調多進程按特定順序推進 | 信號、條件變量、屏障、有序消息隊列 |
| 類別 | 機制 | 特點 | 適用場景 |
|---|---|---|---|
| 管道類 | 匿名管道 pipe | 父子進程,字節流,內核緩衝 | 父子高頻數據流 |
| 命名管道 FIFO | 文件路徑會合,任意進程 | 無親緣進程通信 | |
| 信號 | signal/sigaction | 異步通知,僅編號,不可靠 | 簡單事件通知、進程控制 |
| System V IPC | 消息隊列、共享內存、信號量 | 內核持久,支持權限,API 複雜 | 傳統 Unix 系統進程協作 |
| POSIX IPC | mq、shm、sem | 接口現代,實時性好 | 實時系統、高性能需求 |
| Socket | Unix Domain / TCP/IP | 雙向、字節流/數據報、跨機器 | 網絡通信、本地高性能 IPC |
IPC 解決「隔離進程如何說話、如何不打架、如何排隊」。掌握三大核心問題與同步互斥本質,再按場景選擇具體機制:
pipe。FIFO / Unix Socket。共享內存 + 信號量。sigaction / eventfd。TCP/HTTP/gRPC。工程無銀彈,只有權衡。理解原理,方能駕馭工具。