news 2026/11/2 1:55:17

IPC 进程间通信:无名管道与有名管道详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
IPC 进程间通信:无名管道与有名管道详解

1. 为什么需要 IPC

每个进程都有自己独立的虚拟地址空间,一个进程无法直接访问另一个进程的内存。但实际开发中,进程之间经常需要共享数据或交换信息,例如:

  • 父进程把任务分发给子进程,子进程把结果回传给父进程;
  • 多个进程协作处理同一份数据;
  • 一个进程负责采集数据,另一个进程负责计算或落盘。

这种「进程之间传递数据、同步状态」的机制,统称为IPC(Inter-Process Communication,进程间通信)。

2. IPC 的常见种类

  1. 古老的通信方式:无名管道(pipe)、有名管道(FIFO)、信号(signal);
  2. System V / POSIX IPC:共享内存、消息队列、信号量集;
  3. 网络通信:socket,既能本机通信,也能跨主机通信。

本文重点梳理管道这一类,也就是无名管道和有名管道。

3. 无名管道(pipe)

无名管道 ===》pipe ==》只能给有亲缘关系进程通信
管道的特性:
1、管道是 半双工的工作模式 , 实际编程使用,会当单工使用。
2、所有的管道都是特殊的文件不支持定位操作。lseek->> fd fseek ->>FILE*
3、管道是特殊文件,读写(首选)使用文件IO ,open,read,write,close; 可选(标准io带缓存区)
fgets,fread,fgetc,

编程顺序:创建管道 ==》fork–>读写管道 ==》关闭管道

读端与写端
1,读端存在,一直向管道中去写,超过64k,写会阻塞, 写段写的太快
2,写端是存在的,读管道,如果管道为空的话,读会阻塞。 读段读的太快
3,管道破裂,读端关闭,写管道,会导致写段退出
4, read 0 ,写端关闭,如果管道没有内容,read 0 ; 进程间通信结

创建无名管道函数

int pipe(int pipefd[2]);
功能:创建并打开一个无名管道
参数:pipefd[0] ==>无名管道的固定读端
pipefd[1] ==>无名管道的固定
返回值:成功 0
失败: -1;

代码示例:

``

4. 有名管道(FIFO)

4.1 为什么需要有名管道

无名管道只能用于亲缘进程,一旦两个进程毫无关系(比如两个独立启动的程序),就无法共享同一个管道。有名管道在文件系统中有一个路径名,任何进程只要知道这个路径,就能打开它进行通信。

4.2 特点

  • 在文件系统中以特殊文件形式存在,用 ls -l 可以看到类型为 p;

  • 可以用于任意进程之间通信,不要求亲缘关系;

  • 数据同样存在于内核缓冲区,进程退出后数据消失;

  • 依然是单向的,需要双向通信时通常创建两个 FIFO;

  • 打开 FIFO 时,读端和写端会互相阻塞等待对方打开(除非使用 O_NONBLOCK)。

  • 有名管道 ===》fifo ==》可以给任意单机进程通信 .有文件名称的管道。文件系统中可见

  • 和无名管道特性一致。 额外的, 如果有一端没有打开,则默认在open函数部分阻塞

  • 编程步骤: 创建有名管道 》打开有名管道 ==》读写管道》关闭管道 ==》卸载有名管道

有名管道的函数

int mkfifo(const char *pathname, mode_t mode);
功能:在指定的pathname路径+名称下创建一个权限为
mode的有名管道文件。
参数:pathname要创建的有名管道路径+名称
mode 8进制文件权限。
返回值:成功 0
失败-1;

有名管道间传输png文件代码示例:

1.读端代码:

2.写端代码:

5. 无名管道与有名管道对比

对比项无名管道 pipe有名管道 FIFO
是否有名字无有,存在于文件系统
适用进程仅亲缘进程任意进程
创建方式pipe()mkfifo() 或 mkfifo`命令
数据存储内核缓冲区内核缓冲区
通信方向单向单向
生命周期随进程关闭而消失文件节点保留,需手动删除
  • 无名管道适合父子进程之间简单、临时的数据传递,使用简单但受限于亲缘关系;
  • 有名管道通过文件系统路径解耦了进程关系,适合两个独立程序之间的通信;
  • 两者都是单向字节流,需要双向通信时要成对使用,或者考虑 socketpair、共享内存等方案。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/2 1:54:45

把数据 “装进柜子“:Python 四大容器一次讲透,再也不纠结该用哪种

前面咱们学了变量 —— 但一个变量只能装一个值。真实程序里数据是一堆一堆的:一筐学生的成绩、一本通讯录、一批订单…… 这时候就需要容器(Container)把数据装起来。Python 有四种主力容器:列表 list、元组 tuple、字典 dict、集…

作者头像 李华
网站建设 2026/11/2 1:54:45

国央企班车采购:合规审计与集团多级管理

国央企班车采购:合规审计与集团多级管理 深圳建科院的后勤负责人说过一句话:「建科院曾花费不少时间和精力去寻找市面上能够满足需求的用车供应商,直至找到嘟嘟巴士,才顺利解决所有用车问题。」 听着像客套。放在国企语境里不是。…

作者头像 李华
网站建设 2026/11/2 1:53:18

codefuzzer+bufferfuzzer 将语法引入灰白盒fuzz测试

fuzz测试(模糊测试)一直是非常流行的未知漏洞挖掘方法 模糊测试大概上个世纪80年代就被人提出,到目前为止已经发现了无数个安全漏洞和代码质量问题1.随机fuzz 最早阶段的模糊测试大概就是找到被测目标的数据输入点,对数据进行随机…

作者头像 李华
网站建设 2026/11/2 1:53:02

slub shuffle_freelist

shuffle_freelist() 是 SLUB freelist 随机化机制的建链函数:它利用预先计算好的随机序列 s->random_seq,把一个新 slab 页里的所有对象按随机顺序串成 freelist,使分配顺序不可预测,增加堆溢出攻击的难度。一、函数签名static…

作者头像 李华
网站建设 2026/11/2 1:52:32

Burp Suite安装教程

一共有两个步骤先安装Java环境再安装burp suite通过网盘分享的文件:BurpSuite_Pro_V2026.8.zip 链接: https://pan.baidu.com/s/1qcMCHIw7AN02XBg12MjKaQ?pwdrubt 提取码: rubt先说安装Java配置环境安装java,双击打开jdk。选择安装位置配置Java打开【设…

作者头像 李华
网站建设 2026/11/2 1:51:45

智能家居全国交付中责任闭环架构的设计与实现:到场式交付与兜底式交付的系统差异

一、背景/痛点分析 智能家居全国交付中存在两类交付模式,差异不在执行端能力水平,在服务承诺的终点定义。 到场式交付的承诺终点是执行端到达现场并完成动作。设备安装完成、订单状态标记完成,交付流程即终止。系统不覆盖系统联调、场景验证、…

作者头像 李华