每個進程擁有獨立的虛擬地址空間(代碼、數據、堆、棧)。進程 A 無法直接訪問進程 B 的變量 `a`。若需共享數據或協作,**必須通過內核提供的 IPC 機制**。
// 進程 A
int main() { int a = 3; printf("%d\n", a); }
// 進程 B
int main() { int b = 3; printf("%d\n", b); printf("%d\n", a); // 錯誤:a 不在 B 的地址空間 }
註:問題 2 與 3 統稱為「進程同步與互斥」,是併發編程的核心難點。
| 類別 | 機制 | 特點 | 適用場景 |
|---|---|---|---|
| 管道 | 匿名管道 `|`、命名管道 FIFO | 半雙工、父子/關聯進程、字節流 | Shell 管道、簡單父子通信 |
| System V IPC | 消息隊列、信號量、共享內存 | 內核持久化、標識符訪問、需手動清理 | 傳統 Unix 系統、跨無關進程 |
| POSIX IPC | 消息隊列、信號量、共享內存 | 基於文件系統路徑、語義更清晰 | 現代 Linux/Unix 應用首選 |
| Socket | Unix Domain Socket、TCP/UDP | 全雙工、網絡透明、支持跨主機 | 微服務、分布式、高性能本地通信 |
| 信號 | SIGUSR1、SIGCHLD 等 | 異步通知、載荷極小(僅信號值) | 進程控制、簡單事件觸發 |
本文為概述引導,各機制詳細用法、代碼實戰、避坑指南將在後續專題展開。