一、什么是 IPC
IPC 是 Inter-Process Communication,也就是进程间通信。Linux 中每个进程默认有独立地址空间,一个进程不能直接访问另一个进程的内存。如果多个进程需要协作,就需要 IPC。
常见 IPC 方式:
- 管道 pipe。
- 命名管道 FIFO。
- 信号 signal。
- 共享内存 shared memory。
- 消息队列 message queue。
- Unix Domain Socket。
- TCP/UDP socket。
入门阶段重点掌握 pipe、FIFO、共享内存和 Unix Domain Socket。
二、匿名管道 pipe
匿名管道常用于父子进程之间通信。
特点:
- 单向通信。
- 只能用于有亲缘关系的进程。
- 数据按字节流传输。
示例:
1 |
|
三、命名管道 FIFO
FIFO 可以让没有亲缘关系的进程通信。
创建:
1 | mkfifo /tmp/app.fifo |
终端 1:
1 | cat /tmp/app.fifo |
终端 2:
1 | echo "hello fifo" > /tmp/app.fifo |
FIFO 常用于简单的命令传递和进程协作,但它不是复杂消息协议的最佳选择。
四、共享内存
共享内存允许多个进程映射同一块内存,速度快,但需要同步机制。
常见组合:
1 | shared memory + semaphore / mutex |
如果没有同步,多个进程同时读写会出现竞态问题。
共享内存适合:
- 大量数据交换。
- 图像帧缓存。
- 高频状态共享。
- 低延迟通信。
不适合:
- 简单命令传递。
- 需要强消息边界的场景。
- 不愿处理同步复杂度的场景。
五、Unix Domain Socket
Unix Domain Socket 是本机进程通信常用方式。
优点:
- 支持双向通信。
- 支持流式或数据报。
- 不经过网络协议栈完整路径,效率高。
- 可以用文件路径作为地址。
常见路径:
1 | /tmp/app.sock |
适合:
- 本机服务和客户端通信。
- 后台 daemon 提供控制接口。
- 多进程架构内部通信。
六、Socket 和 FIFO 怎么选
简单规则:
- 父子进程单向通信:pipe。
- 临时命令传递:FIFO。
- 大块数据低延迟共享:shared memory。
- 本机客户端/服务端模型:Unix Domain Socket。
- 跨机器通信:TCP/UDP socket。
七、IPC 排错
查看 Unix socket:
1 | ss -xl |
查看进程打开的文件:
1 | lsof -p <pid> |
查看 FIFO:
1 | ls -l /tmp/app.fifo |
跟踪系统调用:
1 | strace -e read,write,openat,connect,accept ./app |
八、设计建议
IPC 设计时要先回答:
- 谁是服务端,谁是客户端?
- 通信是单向还是双向?
- 是否需要消息边界?
- 数据量大不大?
- 是否需要跨机器?
- 对延迟是否敏感?
- 进程异常退出后怎么清理资源?
不要一上来就选共享内存。共享内存性能好,但同步和生命周期管理更复杂。大多数本机控制接口用 Unix Domain Socket 会更稳。
九、总结
IPC 的本质是让多个独立进程协作。入门阶段不用一次掌握所有机制,先把 pipe、FIFO、Unix Domain Socket 的使用场景分清楚,再根据性能需求学习共享内存。
- 本文链接: https://blog.hansong.icu/2026/06/21/Linux_Dev_IPC/
- 版权声明: 本博客所有文章除特别声明外,均默认采用 CC BY-NC-SA 4.0 许可协议。