很多人第一次学 Linux 进程间通信IPC时都会有一种感觉概念很多API 很杂学完还是不知道到底什么时候该用什么最容易出现的问题是管道和消息队列有什么区别为什么共享内存最快信号量到底是“通信”还是“加锁”Socket 为什么也算进程通信很多文章上来就是pipe() msgget() shmget() semop()结果越看越乱。但其实所有 IPC 的核心本质上都在解决同一个问题两个进程如何交换数据这篇文章不会堆 API。而是从通信本质使用场景数据流动方式底层思想真正讲清 Linux 五大进程通信机制。一、先理解为什么进程之间不能直接通信Linux 中每个进程都有独立内存空间比如QQ 的内存微信不能直接访问否则一个程序随便修改另一个程序的数据系统会彻底混乱因此进程默认是隔离的问题来了如果两个进程想交换数据怎么办Linux 提供了IPCInter Process Communication也就是进程间通信机制二、Linux 五大 IPC 本质区别很多人学 IPC 最大的问题记住了 API没理解数据到底怎么传先直接看本质通信方式本质管道内核中的一块缓冲区消息队列内核中的消息链表共享内存多个进程共享同一块内存信号量控制资源访问Socket跨主机通信你会发现它们最大的区别其实是“数据放在哪”三、管道最简单的进程通信管道是 Linux 中最早的 IPC 方式。它本质上像一根水管数据一端写入另一端读取管道的数据流管道特点管道最大的特点数据只能单向流动因此半双工通信如果想双向通信需要两个管道管道为什么适合父子进程因为fork() 后子进程会继承文件描述符因此父子进程天然能访问同一个管道。管道代码示例#include iostream #include unistd.h using namespace std; int main() { int fd[2]; pipe(fd); pid_t pid fork(); if(pid 0) { char buf[100]; read(fd[0], buf, sizeof(buf)); cout 子进程读取 buf endl; } else { write(fd[1], hello, 6); } return 0; }管道最大的问题管道虽然简单。但它有两个明显缺点1.只能用于有亲缘关系的进程2.容量有限四、消息队列真正的“发消息”消息队列的出现本质上就是相比管道消息队列可以一条一条发送数据而不是像水流一样混在一起消息队列的数据结构消息1 消息2 消息3Linux 内核会按消息组织数据而不是字节流。为什么消息队列更高级因为它支持消息类型消息优先级随机读取消息例如消息类型 1 表示订单消息 消息类型 2 表示日志消息消息队列的问题消息队列虽然灵活。但数据仍然需要拷贝流程是因此效率并不算高五、共享内存最快的 IPC共享内存是 Linux 中速度最快的进程通信方式原因特别简单它根本不拷贝数据传统通信进程A ↓ 内核 ↓ 进程B共享内存进程A ↓ 同一块内存 ↓ 进程B数据只放一份。共享内存为什么快因为多个进程直接访问同一块物理内存没有重复数据拷贝因此共享内存性能最高共享内存的问题但问题也非常明显多个进程可能同时修改数据例如进程A正在写 进程B同时读取数据就可能错乱。因此共享内存必须配合信号量使用六、信号量它不是“传数据”的很多人最容易误解的就是信号量不是用来传数据的它真正作用是控制资源访问你可以把它理解成锁为什么需要信号量比如共享内存多个进程都能访问那谁先写谁后写必须控制。信号量本质一次只允许一个进程访问资源信号量工作流程其他进程必须等待七、Socket不仅能本地通信还能跨网络前面几种 IPC基本都局限于同一台机器但 Socket 不一样。Socket 最大特点不仅能本地通信还能跨服务器通信这也是网络编程本质Socket 通信流程因此QQ 聊天微信消息浏览器访问网站底层本质都是 Socket为什么 Socket 最重要因为现代服务器几乎全部基于 Socket例如Web服务器游戏服务器RedisMySQL本质上都是 Socket 通信八、五种 IPC 到底怎么选这是最重要的问题。通信方式特点适合场景管道简单父子进程消息队列消息组织灵活业务消息通信共享内存速度最快高频数据交换信号量控制同步资源保护Socket支持网络网络通信
Linux 进程间通信(IPC)详解:终于搞懂管道、消息队列、共享内存到底在干什么
发布时间:2026/5/19 7:06:12
很多人第一次学 Linux 进程间通信IPC时都会有一种感觉概念很多API 很杂学完还是不知道到底什么时候该用什么最容易出现的问题是管道和消息队列有什么区别为什么共享内存最快信号量到底是“通信”还是“加锁”Socket 为什么也算进程通信很多文章上来就是pipe() msgget() shmget() semop()结果越看越乱。但其实所有 IPC 的核心本质上都在解决同一个问题两个进程如何交换数据这篇文章不会堆 API。而是从通信本质使用场景数据流动方式底层思想真正讲清 Linux 五大进程通信机制。一、先理解为什么进程之间不能直接通信Linux 中每个进程都有独立内存空间比如QQ 的内存微信不能直接访问否则一个程序随便修改另一个程序的数据系统会彻底混乱因此进程默认是隔离的问题来了如果两个进程想交换数据怎么办Linux 提供了IPCInter Process Communication也就是进程间通信机制二、Linux 五大 IPC 本质区别很多人学 IPC 最大的问题记住了 API没理解数据到底怎么传先直接看本质通信方式本质管道内核中的一块缓冲区消息队列内核中的消息链表共享内存多个进程共享同一块内存信号量控制资源访问Socket跨主机通信你会发现它们最大的区别其实是“数据放在哪”三、管道最简单的进程通信管道是 Linux 中最早的 IPC 方式。它本质上像一根水管数据一端写入另一端读取管道的数据流管道特点管道最大的特点数据只能单向流动因此半双工通信如果想双向通信需要两个管道管道为什么适合父子进程因为fork() 后子进程会继承文件描述符因此父子进程天然能访问同一个管道。管道代码示例#include iostream #include unistd.h using namespace std; int main() { int fd[2]; pipe(fd); pid_t pid fork(); if(pid 0) { char buf[100]; read(fd[0], buf, sizeof(buf)); cout 子进程读取 buf endl; } else { write(fd[1], hello, 6); } return 0; }管道最大的问题管道虽然简单。但它有两个明显缺点1.只能用于有亲缘关系的进程2.容量有限四、消息队列真正的“发消息”消息队列的出现本质上就是相比管道消息队列可以一条一条发送数据而不是像水流一样混在一起消息队列的数据结构消息1 消息2 消息3Linux 内核会按消息组织数据而不是字节流。为什么消息队列更高级因为它支持消息类型消息优先级随机读取消息例如消息类型 1 表示订单消息 消息类型 2 表示日志消息消息队列的问题消息队列虽然灵活。但数据仍然需要拷贝流程是因此效率并不算高五、共享内存最快的 IPC共享内存是 Linux 中速度最快的进程通信方式原因特别简单它根本不拷贝数据传统通信进程A ↓ 内核 ↓ 进程B共享内存进程A ↓ 同一块内存 ↓ 进程B数据只放一份。共享内存为什么快因为多个进程直接访问同一块物理内存没有重复数据拷贝因此共享内存性能最高共享内存的问题但问题也非常明显多个进程可能同时修改数据例如进程A正在写 进程B同时读取数据就可能错乱。因此共享内存必须配合信号量使用六、信号量它不是“传数据”的很多人最容易误解的就是信号量不是用来传数据的它真正作用是控制资源访问你可以把它理解成锁为什么需要信号量比如共享内存多个进程都能访问那谁先写谁后写必须控制。信号量本质一次只允许一个进程访问资源信号量工作流程其他进程必须等待七、Socket不仅能本地通信还能跨网络前面几种 IPC基本都局限于同一台机器但 Socket 不一样。Socket 最大特点不仅能本地通信还能跨服务器通信这也是网络编程本质Socket 通信流程因此QQ 聊天微信消息浏览器访问网站底层本质都是 Socket为什么 Socket 最重要因为现代服务器几乎全部基于 Socket例如Web服务器游戏服务器RedisMySQL本质上都是 Socket 通信八、五种 IPC 到底怎么选这是最重要的问题。通信方式特点适合场景管道简单父子进程消息队列消息组织灵活业务消息通信共享内存速度最快高频数据交换信号量控制同步资源保护Socket支持网络网络通信