在 Linux 中,进程间通信(IPC,Inter-Process Communication)有多种方式,按使用场景可以分为以下几类。下面用原理 + 典型用法 + 适用场景来说明。
int fd[2];
pipe(fd);
if (fork() == 0) {
// 子进程读
read(fd[0], buf, sizeof(buf));
} else {
// 父进程写
write(fd[1], "hello", 5);
}
✅ 适合:简单父子进程通信
❌ 不适合:无关进程、复杂数据
mkfifo /tmp/myfifo
✅ 适合:简单进程通信
❌ 不适合:高性能、结构化数据
msgget()msgsnd()msgrcv()✅ 适合:结构化消息
❌ 接口复杂,已逐渐被新方式取代
shmget()shmat()✅ 适合:高频、大数据通信
❌ 需要自己处理同步
SIGINTSIGKILLSIGUSR1✅ 适合:通知、控制
❌ 不适合:传数据
✅ 适合:复杂系统、服务进程
✅ 跨平台、通用性强
✅ 适合:系统服务通信
❌ 性能一般
✅ 实现简单
❌ 性能差、实时性差
| 场景 | 推荐方式 |
|---|---|
| 父子进程简单通信 | 管道 |
| 高频大数据 | 共享内存 |
| 进程同步 | 信号量 |
| 本地服务 | Unix Domain Socket |
| 通知类 | 信号 |
| 跨网络 | TCP / UDP |
| 桌面系统 | D-Bus |
Linux 进程通信方式很多,实际开发中:
如果你愿意,我可以: