温馨提示×

linux进程怎样进行通信

小樊
37
2026-10-21 02:01:07
栏目: 智能运维

在 Linux 中,进程间通信(IPC,Inter-Process Communication)有多种方式,常用于不同场景。下面按常见程度和典型用途给你系统梳理一下。


一、管道(Pipe)

1. 匿名管道(Anonymous Pipe)

  • 用于有亲缘关系的进程(如父子进程)
  • 单向通信
  • 通过 pipe() 创建
int fd[2];
pipe(fd);
// fd[0] 读,fd[1] 写

特点:

  • 内核缓冲区
  • 数据读完即删
  • 常用于 shell 命令 |

2. 命名管道(FIFO)

  • 可用于无亲缘关系的进程
  • 以文件形式存在(mkfifo)
mkfifo myfifo
open("myfifo", O_RDONLY);

二、信号(Signal)

  • 用于异步通知
  • 如 SIGKILL、SIGINT、SIGCHLD
kill(pid, SIGUSR1);

特点:

  • 不能传复杂数据
  • 实时性高
  • 常用于进程控制

三、共享内存(Shared Memory)

  • 最快的 IPC 方式
  • 多个进程映射同一块内存
shmget();
shmat();

常配合:

  • 信号量(Semaphore)做同步

适合:

  • 大数据量
  • 高频通信

四、消息队列(Message Queue)

  • 内核维护的消息链表
  • 可带类型、有序
msgget();
msgsnd();
msgrcv();

特点:

  • 比管道结构化
  • 可随机读消息

五、信号量(Semaphore)

  • 用于进程同步/互斥
  • 不用于传数据
semget();
semop();

常见于:

  • 共享内存保护
  • 生产者消费者模型

六、套接字(Socket)

  • 最通用
  • 可本地(Unix Domain Socket)或网络
socket(AF_UNIX, SOCK_STREAM, 0);

优点:

  • 跨主机
  • 稳定、成熟
  • 常用于服务架构

七、文件(File)

  • 最原始方式
  • 通过读写文件通信

缺点:

  • 慢
  • 需自己处理同步

八、对比总结

方式 速度 是否跨机 典型用途
管道 中 否 shell、父子进程
信号 快 否 控制、通知
共享内存 最快 否 大数据
消息队列 中 否 结构化消息
信号量 快 否 同步
Socket 中 是 通用、网络

九、如何选择?

  • 父子进程简单通信 → 管道
  • 高性能大数据 → 共享内存 + 信号量
  • 异步通知 → 信号
  • 跨机器 → Socket
  • 结构化消息 → 消息队列

如果你愿意,我可以:

  • 给你 C 语言示例
  • 讲 父子进程通信完整代码
  • 或对比 Linux vs Windows IPC

你想深入哪一块?

0 踩