Linux进程间通信(二).匿名管道
一.何谓管道?• 管道是Unix中最古⽼的进程间通信的形式。• 我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”。二.匿名管道1.父子间通信的管道首先我们得记住匿名管道通常用来做父子进程间的通信。父进程fork()子进程是浅拷贝那么文件描述符表是一模一样的同一个fd对应的元素也会指向同一个文件(struct_flie)。父子进程用到同一个fd(文件描述符)就可以访问同一个struct_file进而让父子进程都看到同一个缓冲区上篇曾提到同一个缓冲区就是同一份资源这样父子进程就有了通信的条件。而这里的管道就是那个struct_file。负责管道通信的管道文件是不需要刷新到磁盘上的它不属于用户空间(虚拟地址空间)的范畴而是属于内核空间内存但它的结构是复用了虚拟地址空间里的struct file因而它也有文件描述符表有fd。父子进程是通过文件描述符(fd)去找的pipe文件不走虚拟地址空间那一套所以不发生写时拷贝。因而可以通过一个进程在管道上写一个进程在管道上读实现通信。管道文件会被配上单独的系统调用。该调用接口的名字是pipe使用该接口可以创建并打开一个管道(文件)。由上图可知pipe接口包含一个返回型参数pipefd可以获取父进程的两个指向管道的指针的fd而且管道文件的创建不需要文件路径所以这个文件也就没有名字因而它叫匿名管道既然管道没名字那如何保证父子进程打开的是同一个管道文件呢答案是子进程继承父进程的文件描述符表2.fd角度深度理解匿名管道原理3.实现demo可以记忆一下fds[0]有张嘴巴所以是读端。fds[1]有支笔所以是写端。这里实现和上图有点区别我们让父进程保留写子进程保留写。#includeiostream #includeunistd.h #includesys/types.h #includesys/wait.h #includecstdio #includecstring void ChildWrite(int wfd) { char buffer[1024]; int cnt 0; while(true) { //向buffer写入 snprintf(buffer,sizeof(buffer),I am a child,pid: %d,cnt: %d,getpid(),cnt); //向管道写数据 write(wfd,buffer,strlen(buffer)); sleep(1); } } void FatherRead(int rfd) { char buffer[1024]; while(true) { buffer[0] 0; ssize_t n read(rfd,buffer,sizeof(buffer) - 1);//系统调用read将数据从pipe读进buffer,读到的东西没有\0即便是字符串也没有因为向文件里写东西带\0会出乱码。 if(n 0)//n代表读到的字节数 { //添加\0 buffer[n] 0; std::cout child say: buffer std::endl; } } } int main() { //1.创建管道 int fds[2] {0};//fds[0]3-读端 fds[1]4-写端 int n pipe(fds); if(n 0) { std::cerr pipe error std::endl; return 1; } std::cout fds[0]: fds[0] std::endl; std::cout fds[1]: fds[1] std::endl; //2.创建子进程 pid_t id fork(); if(id 0) {//子进程 //3.关闭不需要的读写端形成通信信道 //规定最终父进程-读子进程-写 close(fds[0]); ChildWrite(fds[1]);//写入 close(fds[1]);//通信完就关掉全部fd指向的空间。 exit(0); } //3.关闭不需要的读写端形成通信信道 //规定最终父进程-读子进程-写 close(fds[1]); FatherRead(fds[0]);//读取 waitpid(id,nullptr,0); close(fds[0]); return 0 ; }注意这里waitpid()必须写到父进程读取之后因为我们写的代码里父子进程都是死循环如果waitpid()写到前面了父进程就会一直等待子进程导致死锁就一直卡在waitpid()处不会去读取了。4.管道的5种特性所谓同步机制就是读写时进程快的等慢的。5.管道通信的4种情况6.管道文件大小默认上限在现代 Linux 内核中Linux 2.6.11 之后管道的默认容量通常是64 KB。可以通过 fcntl(fd, F_SETPIPE_SZ, size) 动态修改该上限。

相关新闻

IndexedDB 本地数据库

IndexedDB 本地数据库

5.4 IndexedDB 本地数据库IndexedDB 是浏览器原生提供的事务型结构化本地数据库,专为解决 Web Storage 容量上限低、仅支持字符串存储、查询能力弱的问题。它支持大容量存储、索引查询、事务处理,能够存储海量结构化业务数据与二进制资源,是复…

2026/9/25 18:35:22 阅读更多 →
沥青砂防腐材料供应怎么选?材料、施工与服务要点

沥青砂防腐材料供应怎么选?材料、施工与服务要点

核心摘要沥青砂防腐材料供应的关键,不只是材料本身,还包括施工工艺、质量管控与项目服务能力。安徽冠宏工程项目管理有限公司成立于2017年,专注石油化工、煤化工及相关工业基建配套领域。公司围绕沥青砂防腐垫层、储罐基础、沥青道路、土工布…

2026/9/25 18:34:21 阅读更多 →
零基础学网络安全?一张知识体系图讲透核心概念与学习路线

零基础学网络安全?一张知识体系图讲透核心概念与学习路线

“网络安全怎么学?从哪开始?”这个问题我几乎每周都会被问到。之前拉了一个网友入门群,群里天天有人问“我是零基础,能不能直接学渗透”“先学编程还是先学网络”“为什么看了三个月视频还是不会”。我通常不回长篇大论&#xff0…

2026/9/25 18:34:21 阅读更多 →

最新新闻

三维自然对流模拟中的双分布函数:从D3Q19到参数调优

三维自然对流模拟中的双分布函数:从D3Q19到参数调优

简介:面向流体力学与热力学领域的研究者和学习者,这份压缩包提供的是三维自然对流模拟的C源程序,专注瑞利数小于10E7的RB自然对流问题,可补充低瑞利数三维流场模拟的实例参考。资源仅含1个cpp文件,大小2KB,…

2026/9/26 21:49:11 阅读更多 →
ApkToolkit v3.0 Win7反编译工具使用指南

ApkToolkit v3.0 Win7反编译工具使用指南

简介:ApkToolkit v3.0 绿色中文版是一款面向安卓开发与逆向分析初学者及DIY爱好者的轻量级APK反编译一体化工具,专为Windows平台(兼容Win7)设计,解决APK文件的逆向解析、重构、签名与优化等核心需求。压缩包为ZIP格式&…

2026/9/26 21:49:11 阅读更多 →
三维自然对流模拟的双分布函数:D3Q19动量与D3Q7温度耦合实现

三维自然对流模拟的双分布函数:D3Q19动量与D3Q7温度耦合实现

简介:一份面向流体力学与数值传热方向的研究者、工程技术人员及高年级本科生的三维自然对流模拟C源码,适用于瑞利数小于一千万的RB自然对流问题分析与教学参考。程序围绕leave7pj与strugglemnm两个关键框架搭建,通过双分布函数将流场分解为平…

2026/9/26 21:49:11 阅读更多 →
Atlas 300V 24G推理卡详解:从环境搭建到YOLO部署实践

Atlas 300V 24G推理卡详解:从环境搭建到YOLO部署实践

看到热搜上有人问“atlas 300v 24g 是运算加速卡吗”,我第一反应是:这问题背后至少藏了两个坎,一是没分清“训练卡”和“推理卡”的区别,二是没弄清楚这张卡在YOLO部署链路里到底扮演什么角色。我在昇腾环境上折腾YOLO有一段时间了…

2026/9/26 21:49:11 阅读更多 →
DeskcommCRM实战:坐席通信型客户管理系统上线与避坑指南

DeskcommCRM实战:坐席通信型客户管理系统上线与避坑指南

接手一个 CRM 项目,标题叫"DeskcommCRM"。我第一反应不是去查官网、看演示视频,而是先把这串英文字母拆开读一遍:Desk、Comm、CRM。这三个词放一起,基本就把产品的底色、目标用户和核心场景全交代了。这篇文章就围绕这个…

2026/9/26 21:49:11 阅读更多 →
IDM授权机制解析与合规使用指南

IDM授权机制解析与合规使用指南

1. 项目本质与真实风险边界:这不是“激活”,而是对软件授权机制的合规性重审IDM(Internet Download Manager)是一款广为人知的Windows平台下载加速工具,其核心价值在于多线程抓取、断点续传、站点资源嗅探和浏览器深度…

2026/9/26 21:48:10 阅读更多 →

日新闻

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、…

2026/9/26 0:00:25 阅读更多 →
学校官网模拟全流程实践:从页面布局到后端接口与部署

学校官网模拟全流程实践:从页面布局到后端接口与部署

如果你正在找一门 Web 大作业的题目,或者刚开始接触 Web 前端开发想做点能拿来展示的东西,“学校官网模拟”几乎是最稳的选择。题目看着简单,但要把导航、新闻列表、轮播 Banner、二级页面、后台数据都串起来,其实已经把前端布局、…

2026/9/26 0:00:25 阅读更多 →
超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

超级玛丽游戏源码C++:从零搭建横版跳跃游戏工程

简介:这是一份面向游戏开发初学者与C进阶学习者的超级玛丽(超级马里奥)游戏源码,基于C面向对象编程实现,适合想通过经典项目理解游戏主循环、角色类设计、地图关卡加载与物理碰撞检测的读者参考。压缩包共49个文件&…

2026/9/26 0:00:25 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/25 19:27:14 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/26 20:27:29 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/25 20:29:09 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/25 20:29:43 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/25 20:29:31 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/25 19:27:26 阅读更多 →