進程間通信 (IPC) 是多任務系統協作的基石。Linux 繼承 Unix 經典 IPC 並擴展現代機制,提供六大核心方式。本文系統剖析各機制原理、特性、適用場景與關鍵 API,助你依需求選型。
pipe(int fd[2]) 建立,fd[0] 讀端、fd[1] 寫端。SIGPIPE。mkfifo(path, mode) 或 mknod(path, S_IFIFO|mode, 0) 建立檔案系統節點。SIGPIPE。sem_init/sem_wait/sem_post/sem_destroy (POSIX 記憶體訊號量,執行緒/進程共享)。semget/semop/semctl (System V 訊號量集,進程間共享)。sigaction handler)。sigval)。msgque,每個佇列為訊息鏈表。msgsnd/msgrcv 收發帶 long mtype 的結構化訊息,支援優先級/類型過濾。msgget) 與 POSIX (mq_open) 兩套 API,後者支援非同步通知 (mq_notify)。shmget/shmat/shmdt/shmctl;POSIX: shm_open/mmap。SCM_RIGHTS)。socket/bind/listen/accept/connect/send/recv,配合 epoll/io_uring 實現高並發。| 需求 | 推薦機制 | 理由 |
|---|---|---|
| 父子進程簡單單向資料流 | 無名管道 | 零設定、自動清理 |
| 無親緣進程、小資料塊、需持久化路徑 | 命名管道 (FIFO) | 檔案系統可見、權限可控 |
| 多進程/執行緒同步、互斥、資源計數 | 訊號量 | 原子操作、核心支援 |
| 非同步事件通知、進程管理 | 訊號 | 標準化、核心主動送達 |
| 結構化訊息、優先級、雙向、持久化 | 訊息佇列 | 類型過濾、非同步通知 |
| 大資料量、高頻、零拷貝、進程間 | 共享記憶體 + 訊號量 | 效能極致、需自管同步 |
| 跨主機、網路服務、微服務、RPC | Socket (TCP/Unix Domain) | 通用標準、生態完整 |
沒有銀彈,只有適合場景的工具。現代 Linux 開發傾向:本機高效能用 Unix Domain Socket + 共享記憶體;微服務跨節點用 TCP Socket (gRPC/HTTP/Thrift);簡單腳本協作用管道/FIFO;複雜同步用 POSIX 訊號量/互斥鎖/條件變數。深入掌握各機制邊界與代價,方能架構出穩健高效的並發系統。