首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> 關於C

C語言進程間通信概述:三大核心問題與同步互斥基礎

     編輯:關於C

進程間通信(IPC,Inter-Process Communication)是多進程協作的基石。每個進程擁有獨立地址空間,若需共享數據或協同完成任務,必須通過內核提供的 IPC 機制。本文概述 IPC 核心動機、三大核心問題、同步與互斥基礎,為後續具體機制(管道、信號、共享內存、消息隊列、Socket)鋪墊。

為什麼需要 IPC?

// 進程 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 交換數據。

IPC 三大核心問題

同步與互斥:問題 2 和 3 的統一視角

  • 互斥:同一時刻只允許一個進程進入臨界區(訪問共享資源的代碼段)。
  • 同步:多進程按協定順序推進(如 A 產生數據 → B 消費數據)。
  • 本質上,同步可視為「帶條件的互斥」,互斥是「無條件同步」。

簡單進程互斥示例:文件鎖

#include 
#include 

int fd = open("lockfile", O_CREAT | O_RDWR, 0644);
struct flock lock = {F_WRLCK, SEEK_SET, 0, 0, 0};

// 加鎖(阻塞)
fcntl(fd, F_SETLKW, &lock);
// 臨界區:訪問共享資源
// 解鎖
lock.l_type = F_UNLCK;
fcntl(fd, F_SETLK, &lock);

IPC 機制分類速查

問題描述典型解決機制
1. 進程如何通信數據如何從一個進程流向另一個管道、FIFO、消息隊列、共享內存、Socket、信號
2. 如何使用臨界資源多進程訪問共享資源(文件、內存、硬件)不衝突信號量、文件鎖、互斥鎖(進程間)、Peterson 算法
3. 如何有序執行任務協調多進程按特定順序推進信號、條件變量、屏障、有序消息隊列
類別機制特點適用場景
管道類匿名管道 pipe父子進程,字節流,內核緩衝父子高頻數據流
命名管道 FIFO文件路徑會合,任意進程無親緣進程通信
信號signal/sigaction異步通知,僅編號,不可靠簡單事件通知、進程控制
System V IPC消息隊列、共享內存、信號量內核持久,支持權限,API 複雜傳統 Unix 系統進程協作
POSIX IPCmq、shm、sem接口現代,實時性好實時系統、高性能需求
SocketUnix Domain / TCP/IP雙向、字節流/數據報、跨機器網絡通信、本地高性能 IPC

後續學習路線圖

  1. 管道系列:popen(偽管道) → pipe(匿名) → mkfifo(命名)。
  2. 信號系列:signal(缺陷) → sigaction(標準) → 實時信號。
  3. 共享內存:mmap(文件映射) → shm_open(POSIX) → 無鎖隊列。
  4. 消息隊列:mq_send/mq_receive → 優先級隊列。
  5. Socket:Unix Domain Socket(本地最快) → TCP/UDP(跨網絡)。

總結

IPC 解決「隔離進程如何說話、如何不打架、如何排隊」。掌握三大核心問題與同步互斥本質,再按場景選擇具體機制:

  • 父子簡單流 → pipe。
  • 無親緣進程 → FIFO / Unix Socket。
  • 高性能共享數據 → 共享內存 + 信號量。
  • 異步事件通知 → sigaction / eventfd。
  • 跨網絡/微服務 → TCP/HTTP/gRPC。

工程無銀彈,只有權衡。理解原理,方能駕馭工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved