进程之间怎么聊天?信号、管道、共享内存、Socket 大乱斗!

------ 小dora 操作系统学习笔记 Vol.5 · 进程通信篇(IPC)


dora:"我创建了两个进程,咋让它们对话?"

操作系统冷冷一笑:"进程是天生孤独的,但我给你桥梁。"

本章目标是:让你轻松理解操作系统中**进程通信(Inter-Process Communication, IPC)**的几种典型方式------信号、管道、共享内存、Socket,并且知道什么时候该用谁,背后又是啥机制。


🧠 一、进程为什么不能直接对话?

操作系统的"内存隔离机制"决定了:

  • 每个进程都有独立的虚拟地址空间
  • 你无法直接访问另一个进程的变量、堆或栈

所以:必须借助操作系统提供的"中介"来通信,这就是 IPC。

📌 巧记口诀:

"进程像独立公寓,交流靠物业搭电梯。"


🔔 二、信号(Signal):最基础的通信方式

信号本质上是一个"异步中断",用于通知进程发生了某个事件。

常见信号:

信号编号 名称 含义
2 SIGINT Ctrl+C 中断
9 SIGKILL 强制杀死进程
15 SIGTERM 请求终止进程
17/18/20 SIGCHLD 子进程退出通知

特点:

  • 轻量级,无需共享资源
  • 通信粒度小,不能传输数据(只能传 signal)

📌 常用于:中断处理、父子进程通知、定时任务

📌 巧记口诀:

"信号像微信提醒,只能告诉你'有事',不能说'啥事'。"


🧵 三、管道(Pipe):标准 I/O 的串联通道

3.1 匿名管道

arduino 复制代码
int pipe(int fd[2]);
  • fd[0]:读端
  • fd[1]:写端

用于具有亲缘关系的进程(如父子)

📌 示例:

shell 复制代码
$ ls | grep .txt

Shell 实际上:

  • fork 出两个子进程
  • 用 pipe 把 ls 的 stdout 和 grep 的 stdin 串起来

📌 特点:

  • 单向
  • 仅限父子进程

3.2 命名管道(FIFO)

bash 复制代码
mkfifo mypipe
  • 可用于任意两个进程(不一定有亲缘关系)
  • 存在于文件系统中,类似设备文件

📌 巧记口诀:

"匿名管道像耳语,只能和亲人讲;命名管道像喇叭,大家都能听。"


🧠 四、共享内存(Shared Memory):最快的通信方式

"你不许动我空间,但我允许你搬来一起住。"

共享内存是多个进程共享一块物理内存区域

ini 复制代码
int shmid = shmget(key, size, IPC_CREAT);
void* addr = shmat(shmid, NULL, 0);

优点:

  • 不需要数据拷贝(零拷贝)
  • 快到飞起,常用于实时系统、数据库、图像处理

缺点:

  • 不安全,需额外同步机制(信号量、互斥锁)

📌 巧记口诀:

"共享内存像情侣合租,快是快,但吵架频繁要协调。"


⚖️ 五、信号量(Semaphore):共享内存的好搭档

  • 本质:一个整型变量 + PV 操作
  • 用于控制共享资源的访问顺序,避免竞态条件(race condition)
scss 复制代码
sem_wait(&sem);   // P操作,等待资源
sem_post(&sem);   // V操作,释放资源

📌 常与共享内存配合使用

📌 巧记口诀:

"你用锅我用铲,排好队不打架。"


🌐 六、Socket 通信:远程/本地皆可聊

Socket 是最强大的 IPC:

  • 可以进程内通信(UNIX 域 Socket)
  • 也可以跨主机通信(TCP/IP)
scss 复制代码
socket() → bind() → listen() → accept()

或:在 Node.js 中这样写:

ini 复制代码
const net = require('net');
const server = net.createServer(socket => {
  socket.write('hello client');
});
server.listen(8080);

📌 巧记口诀:

"Socket 是全球通,跨城跨国都能通。"


🔍 七、总结对比:选谁好?

方式 是否可跨主机 是否传数据 速度 使用场景
信号 Signal 中断、通知
管道 Pipe 父子、串联任务
共享内存 ✅✅ 最快 数据库、实时系统
Socket 中等 网络通信、服务端

📌 巧记口诀:

"信号吼一声,管道说一句,内存放全文,Socket 发快递。"


🧪 面试练习题

Q1:进程之间不能直接访问彼此内存的原因?

✅ 答案:虚拟地址空间隔离(保护性设计)


Q2:哪种 IPC 方式最快?为何?

✅ 答案:共享内存;因无需拷贝、直接访问物理页


Q3:Socket 为何可以跨主机?

✅ 答案:基于网络协议栈,使用 IP + 端口通信


Q4:信号量是做什么用的?

✅ 答案:同步访问共享资源,防止竞态条件


✅ 总结:

"进程各自为战,通信靠中介;哪种方式靠谱,还得看场景!"


相关推荐
小小ken1 天前
docker compose配置PXE服务器通过网络安装操作系统
docker·操作系统·pxe
岑梓铭3 天前
考研408《操作系统》复习笔记,第四章(1)《文件管理概念》
笔记·考研·操作系统·408·os
Thexhy32310 天前
Linux学习,CentOS虚拟机网络存在问题,主网络接口 ens33没有分配到 IP 地址,按照这个流程,99% 的虚拟机无网络访问问题都能得到解决。请从第一
操作系统
CYRUS_STUDIO11 天前
Android 反调试攻防实战:多重检测手段解析与内核级绕过方案
android·操作系统·逆向
YxVoyager12 天前
操作系统(二) :CPU调度
操作系统
pusue_the_sun13 天前
简单概述操作系统的发展
操作系统·计算机组成原理
apolloyhl15 天前
深入理解 Linux 内核进程管理
linux·运维·服务器·操作系统
hour_go17 天前
用户态与内核态的深度解析:安全、效率与优化之道
笔记·操作系统
LUCIAZZZ18 天前
HTTPS优化简单总结
网络·网络协议·计算机网络·http·https·操作系统
fakerth20 天前
【OpenHarmony文件管理子系统】文件访问接口解析
操作系统·openharmony