banner
NEWS LETTER

Linux 系统编程进阶:IPC 进程间通信入门

Scroll down

一、什么是 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>

int main(void) {
int fds[2];
if (pipe(fds) < 0) {
perror("pipe");
return 1;
}

pid_t pid = fork();
if (pid == 0) {
close(fds[1]);
char buf[128];
ssize_t n = read(fds[0], buf, sizeof(buf) - 1);
if (n > 0) {
buf[n] = '\0';
printf("child recv: %s\n", buf);
}
close(fds[0]);
return 0;
}

close(fds[0]);
const char *msg = "hello pipe";
write(fds[1], msg, strlen(msg));
close(fds[1]);
wait(NULL);
return 0;
}

三、命名管道 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
2
/tmp/app.sock
/run/app/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 的使用场景分清楚,再根据性能需求学习共享内存。

其他文章
目录导航 置顶
  1. 1. 一、什么是 IPC
  2. 2. 二、匿名管道 pipe
  3. 3. 三、命名管道 FIFO
  4. 4. 四、共享内存
  5. 5. 五、Unix Domain Socket
  6. 6. 六、Socket 和 FIFO 怎么选
  7. 7. 七、IPC 排错
  8. 8. 八、设计建议
  9. 9. 九、总结
请输入关键词进行搜索