新闻详情

新闻详情

首页 / 资讯中心 / 详情

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) 动态修改该上限。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

DeskcommCRM实践复盘:从选型、落地配置到团队效率提升 2026/9/25 19:05:58

DeskcommCRM实践复盘:从选型、落地配置到团队效率提升

做CRM这条路上,我前后折腾过好几套系统,从轻量的表格管理到重型定制平台都碰过,最后兜兜转转停在了DeskcommCRM上。先说结论:这套系统不算那种第一眼惊艳的工具,但只要你把团队的实际业务流梳理清楚,它的稳…

阅读更多 →
CRM选型与私有化部署实战:从Excel到DeskcommCRM的落地经验 2026/9/25 19:05:58

CRM选型与私有化部署实战:从Excel到DeskcommCRM的落地经验

做CRM选型这件事,我是从去年年中才开始真正想明白的。当时业务团队扩张到三十多人,销售手里各有一份Excel,客户跟进记录一半在微信聊天里,一半在手账本上,周会汇报全靠记忆,客户重不重要全凭感觉&#xff0…

阅读更多 →
DeskcommCRM落地复盘:从Excel到客户管理系统的完整实践 2026/9/25 19:05:52

DeskcommCRM落地复盘:从Excel到客户管理系统的完整实践

今年年初,我们团队做了一次在我看来挺大的调整:把销售和客服手里散落的Excel表格、微信聊天记录、邮件往来,全部收进了一套叫DeskcommCRM的系统里。当时团队一共9个人,客户400多个,说多不多,但已经明显感觉…

阅读更多 →
桌面沟通型CRM:让客户管理融入日常沟通的新思路 2026/9/25 19:05:52

桌面沟通型CRM:让客户管理融入日常沟通的新思路

1. 内容整体设计与思路拆解1.1 为什么我会盯上DeskcommCRM这个名字说实话,我第一次看到DeskcommCRM这几个字的时候,第一反应是这又是个套壳的客户管理系统。国内叫CRM的产品没有一千也有八百,从Salesforce到纷享销客、销售易,再到…

阅读更多 →
知矩地图下载器拼接大图GIS软件全球高清卫星影像、离线地图加载 2026/9/25 19:05:52

知矩地图下载器拼接大图GIS软件全球高清卫星影像、离线地图加载

软件获取地址: 百度网盘 软件获取地址: 百度网盘 知矩地图下 载器是一款面向测绘、规划、科研和工程应用的专业地图浏览与数据获取软件。软件支持天地图、ArcGIS、Google、OpenStreetMap等多种在线地图服务,可进行地图切换、缩放、定位、搜索和多图层叠加显示。内置…

阅读更多 →
桌面通信型CRM实战:从客户数据自动沉淀到高效管理的完整方案 2026/9/25 19:05:52

桌面通信型CRM实战:从客户数据自动沉淀到高效管理的完整方案

1. 为什么我最终选定了DeskcommCRM这类桌面通信型CRM大概在半年多前,我们团队在客户管理这件事上彻底扛不住了。销售在微信里聊客户,售后在电话里接反馈,再加上企业邮箱里的往来记录,三套信息互相不打通,经常出现“上午…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉