进程间通信(IPC,Inter-Process Communication)是操作系统中不同进程之间交换数据或同步操作的机制。以下是常见的进程通信方式及其特点、适用场景和示例:
1. 管道(Pipe)
- 特点:
- 单向通信,半双工(数据只能单向流动)
- 匿名管道仅用于父子进程或兄弟进程
- 命名管道(FIFO)可用于无亲缘关系的进程
- 示例:
# 匿名管道(Shell) ls | grep "txt" # 命名管道(C语言) mkfifo /tmp/myfifo echo "hello" > /tmp/myfifo & cat /tmp/myfifo - 适用场景:简单的单向数据流(如Shell脚本组合命令)
2. 消息队列(Message Queue)
- 特点:
- 结构化消息存储在内核中
- 支持异步通信和优先级队列
- 消息类型标识允许选择性读取
- 示例(Linux系统调用):
// 发送消息 msgsnd(queue_id, &msg, sizeof(msg), 0); // 接收消息 msgrcv(queue_id, &msg, sizeof(msg), msg_type, 0); - 适用场景:需要可靠传输的结构化数据(如任务调度系统)
3. 共享内存(Shared Memory)
- 特点:
- 最快的IPC方式(直接访问同一块内存)
- 需要同步机制(如信号量)防止竞争条件
- 示例(POSIX共享内存):
int fd = shm_open("/shm_name", O_CREAT | O_RDWR, 0666); void *ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); - 适用场景:高性能数据共享(如数据库、科学计算)
4. 信号(Signal)
- 特点:
- 用于通知进程某事件发生
- 不能传递复杂数据,仅发送信号编号
- 示例:
# 发送SIGTERM信号终止进程 kill -15 PID - 适用场景:进程控制(如终止、暂停、恢复进程)
5. 信号量(Semaphore)
- 特点:
- 用于进程同步(互斥或计数)
- 二元信号量相当于互斥锁
- 示例(POSIX信号量):
sem_t sem; sem_init(&sem, 0, 1); // 初始值=1 sem_wait(&sem); // P操作 sem_post(&sem); // V操作 - 适用场景:资源访问控制(如多进程共享文件)
6. 套接字(Socket)
- 特点:
- 支持跨网络或本地进程通信
- 可选择TCP(可靠)或UDP(高效)
- 示例(本地UNIX Socket):
// 服务端 bind(sock, "/tmp/mysocket"); // 客户端 connect(sock, "/tmp/mysocket"); - 适用场景:分布式系统或本地高性能通信(如Docker容器间通信)
7. 文件锁(File Locking)
- 特点:
- 通过文件系统协调进程访问
- 支持建议锁(advisory)或强制锁(mandatory)
- 示例:
flock(fd, LOCK_EX); // 排他锁 - 适用场景:多进程访问共享文件(如日志文件)
8. 内存映射文件(Memory-Mapped File)
- 特点:
- 将文件映射到进程地址空间
- 结合了共享内存和文件IO的优点
- 示例:
void *addr = mmap(NULL, length, PROT_READ, MAP_SHARED, fd, 0); - 适用场景:大文件高效读写(如数据库文件)
对比总结
| 方式 | 通信方向 | 速度 | 数据量 | 复杂度 | 适用场景 |
|---|---|---|---|---|---|
| 管道 | 单向 | 中 | 小 | 低 | 父子进程简单通信 |
| 消息队列 | 双向 | 中 | 中 | 中 | 结构化消息传输 |
| 共享内存 | 双向 | 最快 | 大 | 高 | 高性能数据共享 |
| 信号 | 单向 | - | 极小 | 低 | 进程控制 |
| 信号量 | 同步 | 快 | - | 中 | 资源互斥访问 |
| 套接字 | 双向 | 中 | 大 | 高 | 跨主机或本地通信 |
| 文件锁 | 同步 | 慢 | - | 低 | 文件访问控制 |
| 内存映射文件 | 双向 | 快 | 大 | 中 | 大文件读写 |
如何选择?
- 需要最高性能 → 共享内存(需自行处理同步)
- 简单数据流 → 管道或消息队列
- 跨网络通信 → 套接字
- 进程同步 → 信号量或文件锁
- 大文件处理 → 内存映射文件
理解这些IPC方式的优缺点,能帮助你在实际开发中选择最合适的通信机制。

被折叠的 条评论
为什么被折叠?



