温馨提示×

ubuntu进程通信怎么实现

小樊
46
2026-10-24 09:57:50
栏目: 智能运维

在 Ubuntu(Linux)环境下,进程间通信(IPC,Inter-Process Communication)有多种实现方式,下面按常用程度和使用场景给你系统梳理一下。


一、管道(Pipe)

1️⃣ 匿名管道(父子进程)

特点

  • 只能用于有亲缘关系的进程(如 fork 的子进程)
  • 半双工(单向)

示例(C)

int fd[2];
pipe(fd);
if (fork() == 0) {
    // 子进程
    close(fd[1]);
    read(fd[0], buf, sizeof(buf));
} else {
    // 父进程
    close(fd[0]);
    write(fd[1], "hello", 5);
}

Shell 中

ls | grep test

2️⃣ 命名管道(FIFO)

特点

  • 可用于无亲缘关系进程
  • 以文件形式存在

创建

mkfifo /tmp/myfifo

写进程

echo "hello" > /tmp/myfifo

读进程

cat /tmp/myfifo

二、消息队列(Message Queue)

System V 消息队列

  • 内核维护
  • 可按消息类型读取

特点

  • 有结构
  • 适合多进程通信

API

  • msgget
  • msgsnd
  • msgrcv

三、共享内存(Shared Memory)✅ 最快

System V / POSIX

  • 多个进程映射同一块内存
  • 速度最快(无内核拷贝)

步骤

  1. 创建共享内存
  2. 映射
  3. 访问
  4. 卸载 & 删除

示例(POSIX)

shm_open("/myshm", O_CREAT | O_RDWR, 0666);
mmap(...)

⚠️ 通常需要配合 信号量 做同步


四、信号(Signal)

特点

  • 异步通知
  • 不能传复杂数据

示例

kill(pid, SIGUSR1);

常用信号

  • SIGINT
  • SIGTERM
  • SIGUSR1 / SIGUSR2

五、信号量(Semaphore)

用途

  • 进程同步
  • 控制共享资源访问

类型

  • System V 信号量
  • POSIX 信号量

六、Socket(最通用)✅

可用于:

  • 本地进程(Unix Domain Socket)
  • 网络通信

Unix Socket 示例

socket(AF_UNIX, SOCK_STREAM, 0);
bind();
listen();
accept();

Python 示例

import socket
s = socket.socket(socket.AF_UNIX)
s.connect("/tmp/test.sock")

七、文件(最原始)

  • 通过读写文件
  • 需加锁(fcntl / flock)

八、D-Bus(Ubuntu 桌面常见)

  • 桌面环境进程通信
  • 系统服务通信
dbus-send ...

九、选择建议(实用对照)

场景 推荐方式
父子进程 pipe
本地多进程 共享内存 + 信号量
稳定服务通信 Unix Socket
桌面程序 D-Bus
简单通知 Signal
高性能 共享内存

十、如果你愿意

我可以:

  • ✅ 给你 Python / C / C++ 示例
  • ✅ 对比 性能
  • ✅ 帮你选 最适合你项目的方案
  • ✅ 写 完整可运行 demo

你现在的场景是?
(比如:两个 Python 程序?C 服务?Ubuntu 后台进程?)

0 踩