温馨提示×

Linux 进程如何通信

小樊
39
2026-08-31 09:56:45
栏目: 智能运维

在 Linux 中,进程间通信(IPC,Inter-Process Communication)有多种方式,按使用场景可以分为以下几类。下面用原理 + 典型用法 + 适用场景来说明。


一、传统 IPC 方式

1️⃣ 管道(Pipe)

匿名管道

  • 特点
    • 只能用于有亲缘关系的进程(父子进程)
    • 半双工(单向)
  • 原理
    • 内核维护一块缓冲区
  • 示例
int fd[2];
pipe(fd);
if (fork() == 0) {
    // 子进程读
    read(fd[0], buf, sizeof(buf));
} else {
    // 父进程写
    write(fd[1], "hello", 5);
}

✅ 适合:简单父子进程通信
❌ 不适合:无关进程、复杂数据


2️⃣ 命名管道(FIFO)

  • 特点
    • 有文件系统中的路径
    • 可用于无关进程
  • 创建
mkfifo /tmp/myfifo
  • 使用
    • 一个进程读,一个进程写
    • 行为与匿名管道类似

✅ 适合:简单进程通信
❌ 不适合:高性能、结构化数据


二、System V IPC(较老但仍常用)

3️⃣ 消息队列(Message Queue)

  • 特点
    • 消息按类型读写
    • 内核持久化(直到被删除)
  • 接口
    • msgget()
    • msgsnd()
    • msgrcv()

✅ 适合:结构化消息
❌ 接口复杂,已逐渐被新方式取代


4️⃣ 共享内存(Shared Memory)

  • 特点
    • 最快的 IPC
    • 多个进程映射同一块内存
  • 配合
    • 常与 信号量 一起使用防止竞争
  • 接口
    • shmget()
    • shmat()

✅ 适合:高频、大数据通信
❌ 需要自己处理同步


5️⃣ 信号量(Semaphore)

  • 用途
    • 进程间同步 / 互斥
  • 不是用来传数据
  • 分类
    • System V 信号量
    • POSIX 信号量(更推荐)

三、现代常用 IPC 方式

6️⃣ 信号(Signal)

  • 特点
    • 异步通知
    • 只能携带“信号编号”
  • 常见信号
    • SIGINT
    • SIGKILL
    • SIGUSR1

✅ 适合:通知、控制
❌ 不适合:传数据


7️⃣ 套接字(Socket)✅(最推荐)

分类

  • 本地套接字(Unix Domain Socket)
  • 网络套接字(TCP/UDP)

Unix Domain Socket

  • 比 TCP 快
  • 可用于无关进程
  • 支持字节流 / 数据报

✅ 适合:复杂系统、服务进程
✅ 跨平台、通用性强


8️⃣ D-Bus(桌面/系统级)

  • 常用于:
    • systemd
    • 桌面环境
  • 基于消息总线

✅ 适合:系统服务通信
❌ 性能一般


四、文件方式(简单但低效)

  • 通过读写普通文件通信
  • 需要配合锁(fcntl、flock)

✅ 实现简单
❌ 性能差、实时性差


五、如何选型(重点)

场景 推荐方式
父子进程简单通信 管道
高频大数据 共享内存
进程同步 信号量
本地服务 Unix Domain Socket
通知类 信号
跨网络 TCP / UDP
桌面系统 D-Bus

六、总结一句话

Linux 进程通信方式很多,实际开发中:

  • 最常用:Socket
  • 最快:共享内存
  • 最简单:管道
  • 最通用:Socket

如果你愿意,我可以:

  • 一张思维导图总结
  • 给你 一段完整 C 示例
  • 或结合 你当前的项目场景帮你选型

0