首页/新闻资讯/正文详情

Linux进程间通信(二).匿名管道

发布时间:2026/9/25 18:35:13 来源:云帆数科 栏目:资讯中心
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) 动态修改该上限。

相关推荐

自动化变更风险评分模型:结合提交者资历与修改模块的综合评分
自动化变更风险评分模型:结合提交者资历与修改模块的综合评分

自动化变更风险评分模型:结合提交者资历与修改模块的综合评分在敏捷研发与持续集成的流水线中,代码审查(Code Review)常常陷入两难困境: 过度审查:修改一个文案或调整前端样式,也强制要求两位资… · 2026/9/25 18:35:01

基于 ESPnet2 训练 IISc-MILE 泰米尔语 ASR:E-Branchformer + BPE 混合 CTC/Attention 端到端识别实践指南
基于 ESPnet2 训练 IISc-MILE 泰米尔语 ASR:E-Branchformer + BPE 混合 CTC/Attention 端到端识别实践指南

人工智能语音音频深度学习NLP 【免费下载链接】espnet End-to-End Speech Processing Toolkit 项目地址: https://gitcode.com/gh_mirrors/es/espnet 点击查看 免费下载 导读 本文围绕 ESPnet 开源仓库中的 egs2/ta_openslr127/asr1 recipe,完整讲解如… · 2026/9/25 18:35:01

Linux安装Chrome全指南:rpm与deb包格式详解及依赖问题排查
Linux安装Chrome全指南:rpm与deb包格式详解及依赖问题排查

打开Google Chrome的Linux下载页,很多人会愣一下:明明只是装个浏览器,页面却同时给了rpm和deb两个安装包,旁边还附着一堆命令行说明。更常见的是下面这种场景:系统是CentOS 7,下载了最新版rpm包&#xff0c… · 2026/9/25 18:34:54

AI驱动的代码审查工具open-code-review:设计与落地实践
AI驱动的代码审查工具open-code-review:设计与落地实践

做代码审查这件事,我在团队里坚持了快五年。从最早靠人肉盯着 diff 一页页翻,到后来引入各种静态检查工具,再到尝试 AI 辅助 review,踩过的坑和走过的弯路确实不少。最近我把这套流程沉淀成了一个开源项目 open-code-review&#… · 2026/9/25 19:08:50

Qwen-Image-2.1本地部署实战:6G显存跑通ComfyUI多模态图像生成
Qwen-Image-2.1本地部署实战:6G显存跑通ComfyUI多模态图像生成

1. 项目概述:为什么这个整合包值得你花30分钟认真读完Qwen-Image-2.1不是又一个“跑个demo就卡死”的模型,它是通义实验室在图像生成领域真正落地的工业级能力封装——不是概念验证,而是能直接嵌入你本地工作流的生产力工具。我从去年底开始跟… · 2026/9/25 19:08:44

Atlas 300V 24G部署YOLOv5全流程:CANN生态与避坑指南
Atlas 300V 24G部署YOLOv5全流程:CANN生态与避坑指南

先别急着看参数表。这段时间不少朋友在群里问我同一个问题:Atlas 300V 24G到货了,这玩意到底是不是一张能拿来加速的卡?问得再具体一点:能不能跑YOLO?怎么跑?我说能跑,但前提是先把“运算加速卡… · 2026/9/25 19:08:44

Cookie、Session、Token、JWT终于讲清楚了:从原理到选型实战
Cookie、Session、Token、JWT终于讲清楚了:从原理到选型实战

刚接手一个老项目时,我差点被登录模块劝退。项目里Cookie、Session、Token、JWT四样东西全都在用,接口层用JWT做鉴权,老页面又依赖Session里的登录态,还有个定时任务拿着Cookie去抓第三方数据。三个文件看起来都能“证明你是谁”&… · 2026/9/25 19:08:38

MFC对话框工程集成SQLite3:配置、封装与踩坑实录
MFC对话框工程集成SQLite3:配置、封装与踩坑实录

简介:一份演示在MFC对话框程序中集成SQLite3数据库的完整示例工程,基于Visual Studio 2010开发,面向初学MFC或需要在Windows桌面应用中加入嵌入式数据库的开发者,也可供课程设计与小型工具开发参考。项目覆盖从引入SQLite库、连接… · 2026/9/25 19:08:38

极域工具包1.1:窗口化与解键盘锁的机房运维实战指南
极域工具包1.1:窗口化与解键盘锁的机房运维实战指南

1. 极域工具包 1.1 到底解决了什么问题1.1 从机房管理场景说起学生机房这个场景,干过运维或者当过机房管理员的人都懂,它有一套非常固定的运行逻辑:教师端通过极域电子教室这类课堂管理软件,对学生机进行屏幕广播、远程控制、键盘… · 2026/9/25 19:08:32

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码