Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 進程間通信 (IPC) 全景圖:管道、訊號量、訊號、訊息佇列、共享記憶體、Socket 六大機制深度解析

編輯:Linux 教學

進程間通信 (IPC) 是多任務系統協作的基石。Linux 繼承 Unix 經典 IPC 並擴展現代機制,提供六大核心方式。本文系統剖析各機制原理、特性、適用場景與關鍵 API,助你依需求選型。

一、管道 — 最古老、最簡單的單向流

1. 無名管道

  • pipe(int fd[2]) 建立,fd[0] 讀端、fd[1] 寫端。
  • **半雙工**:資料單向流動;雙向需建立兩個管道。
  • **僅限親緣關係**:父子、兄弟進程 (透過 fork 繼承 fd)。
  • **核心緩衝**:資料駐留記憶體,無檔案系統實體,讀寫遵循 FIFO。
  • 讀寫行為:寫端關閉 → 讀端讀到 EOF;讀端關閉 → 寫端收 SIGPIPE。

2. 命名管道 (FIFO)

  • mkfifo(path, mode) 或 mknod(path, S_IFIFO|mode, 0) 建立檔案系統節點。
  • **打破親緣限制**:任何擁有路徑存取權的進程皆可開啟通信。
  • 同樣半雙工、FIFO、有大小限制 (PIPE_BUF 通常 4KB/64KB)。
  • **注意**:必須有讀端存在時寫入才有意義,否則寫端收 SIGPIPE。

二、訊號量 — 同步與互斥的計數器

  • 本質:受保護的整數計數器,僅支援兩個原子操作 P (wait/down) 與 V (signal/up)。
  • sem_init/sem_wait/sem_post/sem_destroy (POSIX 記憶體訊號量,執行緒/進程共享)。
  • semget/semop/semctl (System V 訊號量集,進程間共享)。
  • 常作為**鎖**保護共享資源 (共享記憶體、關鍵區) 或**資源池**計數 (連線池、緩衝區槽位)。

三、訊號 — 非同步事件通知

  • 核心向進程傳遞預定義事件 (中斷、非法指令、子進程結束、終端鍵盤、定時器、I/O 就緒…)。
  • 進程三種處置:預設動作 (終止/核心傾印/忽略/暫停/繼續)、忽略、捕捉 (註冊 sigaction handler)。
  • **不可靠**:標準訊號不排隊,同一訊號多次發送可能合併;實時訊號 (SIGRTMIN+) 支援排隊。
  • **資訊量極少**:僅一個整數訊號號碼,無法攜帶資料負載 (實時訊號可帶 sigval)。

四、訊息佇列 — 結構化資料的鏈表

  • 核心維護佇列向量表 msgque,每個佇列為訊息鏈表。
  • msgsnd/msgrcv 收發帶 long mtype 的結構化訊息,支援優先級/類型過濾。
  • 克服管道「無格式位元流」與「緩衝區小」缺點;克服訊號「資訊量少」缺點。
  • System V (msgget) 與 POSIX (mq_open) 兩套 API,後者支援非同步通知 (mq_notify)。

五、共享記憶體 — 最快 IPC,但需自行同步

  • 將同一物理頁面映射至多進程虛擬位址空間,**零拷貝**,延遲最低。
  • System V: shmget/shmat/shmdt/shmctl;POSIX: shm_open/mmap。
  • **核心不提供同步**,必須搭配訊號量、互斥鎖、RCU 等機制保護並發存取。
  • 適用:大量資料高頻交換 (影像幀、訊號處理、資料庫緩衝池)。

六、Socket — 跨主機、跨協議的通用端點

  • 不僅進程間,更支援**跨網路主機**通信 (TCP/UDP/Unix Domain/Netlink…)。
  • 每個 Socket 擁有唯一識別 (協議族、類型、協議、本地/對端位址)。
  • Unix Domain Socket (AF_UNIX) 本機通信比網路 Socket 更快 (無協議棧開銷),支援傳遞檔案描述符 (SCM_RIGHTS)。
  • 標準 API: socket/bind/listen/accept/connect/send/recv,配合 epoll/io_uring 實現高並發。

七、選型決策樹

需求推薦機制理由
父子進程簡單單向資料流無名管道零設定、自動清理
無親緣進程、小資料塊、需持久化路徑命名管道 (FIFO)檔案系統可見、權限可控
多進程/執行緒同步、互斥、資源計數訊號量原子操作、核心支援
非同步事件通知、進程管理訊號標準化、核心主動送達
結構化訊息、優先級、雙向、持久化訊息佇列類型過濾、非同步通知
大資料量、高頻、零拷貝、進程間共享記憶體 + 訊號量效能極致、需自管同步
跨主機、網路服務、微服務、RPCSocket (TCP/Unix Domain)通用標準、生態完整

結語

沒有銀彈,只有適合場景的工具。現代 Linux 開發傾向:本機高效能用 Unix Domain Socket + 共享記憶體;微服務跨節點用 TCP Socket (gRPC/HTTP/Thrift);簡單腳本協作用管道/FIFO;複雜同步用 POSIX 訊號量/互斥鎖/條件變數。深入掌握各機制邊界與代價,方能架構出穩健高效的並發系統。

Copyright © Windows教程網 All Rights Reserved