進程間通信 (IPC) 是作業系統提供的協調機制,解決獨立地址空間進程間的數據交換與同步。Linux 提供 7 種經典 IPC 方式,各有優勢適用場景。
| 機制 | 類型 | 數據流向 | 親緣要求 | 特點 | 典型用途 |
|---|---|---|---|---|---|
| 無名管道 (pipe) | 半雙工 | 單向 | 父子/兄弟 (有親緣) | 簡單、字節流、無名、生命週期隨進程 | Shell 管道 ls | grep、父子進程通信 |
| 有名管道 (FIFO / named pipe) | 半雙工 | 單向 | 無親緣要求 | 文件系統有路徑、遵循 open/close、支援非親緣進程 | 不相關進程通信、日誌收集 |
| 信號量 (semaphore) | 同步原語 | 非數據傳輸 | 無親緣要求 | 計數器、PV 操作、互斥/同步、System V / POSIX 兩套 API | 共享資源互斥、生產者消費者、進程同步 |
| 消息隊列 (message queue) | 數據傳輸 | 雙向 | 無親緣要求 | 鏈表結構、內核持久化、帶類型/優先級、有容量上限 | 異步任務分發、進程間結構化數據交換 |
| 信號 (signal) | 異步通知 | 單向 | 無親緣要求 | 軟中斷、預定義編號、可捕獲/忽略/默認、不可攜帶數據 (實時信號除外) | 異常通知、定時器、進程終止控制 |
| 共享內存 (shared memory) | 數據傳輸 | 雙向 (直接訪問) | 無親緣要求 | 最快、映射同一物理頁、需配合信號量/互斥鎖同步、System V shm / mmap 兩種實現 | 大數據高速交換、視頻幀共享、高性能緩存 |
| 套接字 (socket) | 網絡/本地通信 | 雙向 | 跨主機 | 通用性最強、支援 TCP/UDP/Unix Domain、標準網絡編程接口、可跨機器 | 網絡服務、微服務通信、本地進程通信 (Unix Domain Socket) |
需要跨主機通信? → Socket (TCP/UDP) 否 → 需要最高性能大數據傳輸? → 共享內存 + 信號量/互斥鎖 否 → 需要結構化異步消息? → 消息隊列 (POSIX mq 推薦) 否 → 簡單父子進程單向數據流? → 無名管道 否 → 無親緣進程簡單單向流? → 有名管道 (FIFO) 否 → 進程同步/互斥? → 信號量 (POSIX sem 推薦) 否 → 異步事件通知? → 信號 (實時信號 SIGRTMIN+ 攜帶數據)
| 機制 | System V (舊) | POSIX (新,推薦) |
|---|---|---|
| 信號量 | semget, semop, semctl | sem_open, sem_wait, sem_post, sem_close, sem_unlink |
| 共享內存 | shmget, shmat, shmdt, shmctl | shm_open, mmap, munmap, shm_unlink |
| 消息隊列 | msgget, msgsnd, msgrcv, msgctl | mq_open, mq_send, mq_receive, mq_close, mq_unlink |
理解 7 種經典 IPC 的數據流向、同步語義、性能特徵、API 風格,是 Linux 系統程式設計的必修課。現代架構傾向於用戶態消息庫 + 共享內存 + 事件驅動組合,但在容器化、微服務場景下,網絡化 IPC (gRPC, REST, Message Broker) 成為主流選擇。