1. Pipe 是什么
Pipe(无名管道)是 Linux 最简单的 IPC 机制之一。
核心思想:
父进程
│
write()
↓
┌──────────────┐
│ Pipe │
│ 内核缓冲区 │
└──────────────┘
│
read()
↓
子进程
2026/8/25大约 3 分钟
Pipe(无名管道)是 Linux 最简单的 IPC 机制之一。
核心思想:
父进程
│
write()
↓
┌──────────────┐
│ Pipe │
│ 内核缓冲区 │
└──────────────┘
│
read()
↓
子进程
FIFO(Named Pipe,命名管道)本质上也是管道。
区别在于:
FIFO 在文件系统中拥有一个名字,因此没有亲缘关系的进程也可以通信。
进程A 进程B
│ │
write() read()
│ │
└──────────┐ ┌──────────┘
↓ ↓
┌──────────────┐
│ FIFO │
│ 命名管道 │
└──────────────┘
消息队列是 Linux 内核维护的一个消息仓库。
发送进程
│
msgsnd()
↓
┌──────────────────┐
│ type=1 hello │
│ type=2 ledon │
│ type=3 quit │
└──────────────────┘
↓
msgrcv()
│
接收进程
共享内存的核心就一句话:
多个进程把同一块物理内存映射到自己的虚拟地址空间,然后直接通过指针读写。
进程A 进程B
│ │
shmat() shmat()
↓ ↓
┌──────────────────────────────┐
│ 共享内存 │
│ "Hello Linux" │
└──────────────────────────────┘
↑ ↑
│ │
写 读
进程同步解决的是:
多个进程之间的执行先后关系。
例如:
子进程先完成
↓
通知父进程
↓
父进程再继续
多个进程同时访问共享资源时:
同一时间只能有一个进程进入临界区。
本例中,父子进程都执行:
printf("%c", ch);
sleep(rand() % 3);
printf("%c", ch);
Signal(信号)是一种异步通知机制。
它不是用来传输大量数据,而是告诉进程:
发生了一件事。
Ctrl+C
↓
SIGINT
↓
进程
↓
信号处理函数
Socket 是 Linux 提供的网络通信接口。
本例使用 TCP:
socket(AF_INET, SOCK_STREAM, 0);
AF_INET → IPv4
SOCK_STREAM → TCP
Linux 常见 IPC 有两套体系:
System V IPC POSIX IPC
│ │
├─ 消息队列 ├─ 消息队列
├─ 共享内存 ├─ 共享内存
└─ 信号量 └─ 信号量
磁盘上的程序只是代码和数据:
程序
↓ 执行
进程
