进程间通信--管道

一、为什么要有进程间通信(目的)

数据传输:一个进程需要将它的数据发送给另一个进程
资源共享:多个进程之间共享同样的资源。
通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变

二、怎样做到进程间通信?

无论是发送数据,还是共享数据或协同、控制

进程间通信的本质:是让不同的进程看到同一份资源

为了不破坏进程的独立性,这份资源不属于任何一个进程,而是由OS提供的一块特定形式的内存空间。

进程(用户)利用该空间进行通信,本质上就是访问OS。该空间的建立、释放,底层设计和接口都由OS来完成。

而管道是一种基于文件级别(不与磁盘交互)的通信方式。

三、匿名管道

1、匿名管道的原理/如何建立通信

如图所示,父子进程(有血缘关系的进程)通过继承体系,继承Task_struct的文件描述符表

父进程以WR方式打开该文件,引用计数为2,fork创建子进程,引用计数变为4.

思考:通信时产生的  访问冲突,临界资源竞争

OS在设计上为了简化整个过程,采用了单向通信的模式,即一个读,另一个写。

为实现双向通信,可以再创建一个管道,让通信方向相反即可。

2、打开管道的系统调用接口pipe

输出型参数  pipefd[0]  pipefd[1]分别为读写的fd。

例子:子进程sleep(1),父一直read

#define N 2
#define NUM 128
void Writer(int wfd)
{string str = "I am a child ";pid_t self = getpid();int number=0;//充当缓冲区char buffer[NUM];while(true){//字符串清空,只是为了提醒阅读代码的人,把这个数组当成字符串了buffer[0]=0;snprintf(buffer,sizeof(buffer),"msg:%s--pid:%d--num:%d",str.c_str(),self,number++);write(wfd,buffer,strlen(buffer));//不用+1,系统层面不用加\0sleep(1);}
}
void Reader(int rfd)
{char buffer[NUM];while(true){buffer[0]=0;ssize_t n = read(rfd,buffer,sizeof(buffer));if(n>0){//读取之后按字符串处理buffer[n]='\0';printf("father get msg:%s father_pid:%d\n",buffer,getpid());// cout << "father get a message[" << getpid() << "]# " << buffer << endl;}else if(n==0){cout<<"father read file done";}else break;}
}
// child--w   father--r
//IPC code
int main()
{int pipefd[N] = {0};int n = pipe(pipefd);if (n < 0)return 1;// cout<<"pipefd[0]:"<<pipefd[0]<<"  "<<"pipefd[1]:"<<pipefd[1]<<endl;pid_t id = fork();if (id < 0)return 2;//先形成单向信道if (id == 0){// child  关掉3// 向4中写入close(pipefd[0]);Writer(pipefd[1]);close(pipefd[1]);exit(0);}// father关掉4// 从3中读取close(pipefd[1]);Reader(pipefd[0]);int rid = waitpid(id,NULL,0);if(rid<0)return 3;close(pipefd[0]);return 0;
}

3、管道的特点

进程退出,文件都关闭了,管道作为内存级文件也会被OS自动释放

4、管道4种情况

1、如果read完了管道内的所有数据,如果写端没有继续写入数据,那么读取端就只能继续等待。

w:1s写一次   r:读完后,也要等1s

2、如果写端把管道写满了就不能继续写入了。

w:短时间写多次直至写满,等待读取   r:5s读一次,一次读整个缓冲区大小

tips:管道大小

64kb 65536b

读写atomic原子性问题。一次读写的数据作为一个整体的单位 PIPE_BUF为4kb

例如hello world是一体的,不会只读一部分hello

3、如果我关闭了写入端,读取完了管道内的数据,继续读就会返回0,表示读取到了文件的结尾。

子进程退出后,父进程一直read(不阻塞),返回0表示读到文件结尾(多次调用read,每次都返回0,表明读到了文件结尾)

4、写端一直写入,但是把读端关闭,操作系统会直接杀死一直在写入的进程,并且关闭管道,操作系统会通过信号来终止进程13)SIGPIPE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/171980.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

23种设计模式 - 模板方法模式

1. 认识模板方法模式 1.1 模式定义 定义一个操作算法中的框架&#xff0c;而将这些步骤延迟加载到子类中。 它的本质就是固定算法框架。 1.2 解决何种问题 让父类控制子类方法的调用顺序 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 1.3…

【Linux进程】进程控制

目录 一、进程创建 1.2 fork函数初识 1.2 fork函数返回值 1.3 写时拷贝 1.4 fork常规用法 1.5 fork调用失败的原因 二、进程终止 2.1 进程退出场景 2.2 进程退出码 2.2.1 用strerror打印错误信息 2.2.2 errno全局变量 2.3 进程常见退出方法 2.3.1 进程正常退出 2…

阿里云国际站:密钥管理服务

文章目录 一、密钥管理服务的概念 二、密钥管理服务的功能 三、密钥管理服务的优势 一、密钥管理服务的概念 密钥管理服务KMS&#xff08;Key Management Service&#xff09;是您的一站式密钥管理和数据加密服务平台、一站式凭据安全管理平台&#xff0c;提供简单、可靠、…

国产双核DSP与 TI 的TMS320F28377 大PK

国产DSP&#xff0c;QX320F28377与 TI的 TMS320F28377 孰强孰弱

《QT从基础到进阶·二十六》绘制多个图形项(QGraphicsRectItem,QGraphicsLineItem,QGraphicsPolygonItem)

这个demo用QT实现了对多个图形项的绘制&#xff0c;包括矩形的绘制&#xff0c;直线的绘制和多边形的绘制&#xff0c;是之前一章中绘制矩形的增强版&#xff0c;之前一章节关于矩形的绘制可以参考&#xff1a;《QT从基础到进阶十五》用鼠标绘制矩形&#xff08;QGraphicsView、…

深入理解ElasticSearch分片

1. 路由计算 当索引一个文档的时候&#xff0c;文档会被存储到一个主分片中。 Elasticsearch 如何知道一个文档应该存放到哪个分片中呢&#xff1f;当我们创建文档时&#xff0c;它如何决定这个文档应当被存储在分片 1 还是分片 2 中呢&#xff1f;首先这肯定不会是随机的&…

uniapp 小程序 身份证 和人脸视频拍摄

使用前提&#xff1a; 已经在微信公众平台的用户隐私协议&#xff0c;已经选择配置“摄像头&#xff0c;录像”等权限 开发背景&#xff1a;客户需要使用带有拍摄边框的摄像头 &#xff0c;微信小程序的方法无法支持&#xff0c;使用camera修改 身份证正反面&#xff1a; <…

python读取excel,进行数据处理

一、准备python编译器 二、下载 pyexcel 库 pip install pyexcel-xls三、进行编码读取数据 import pyexcel# 读取Excel文件 成本中心字典 data pyexcel.get_array(file_name成本中心.xls)def hand():#打印数据#print(data)url f"INSERT INTO dst_base.sys_dict(p_…

OpenCV C++ 图像处理实战 ——《多二维码识别》

OpenCV C++ 图像处理实战 ——《多二维码识别》 一、结果演示二、zxing库配置2.1下载编译三、多二维码识别3.1 Method one3.1.1 源码3.2 Method two3.2.1 源码四、源码测试图像下载总结一、结果演示 </

无监督学习的集成方法:相似性矩阵的聚类

在机器学习中&#xff0c;术语Ensemble指的是并行组合多个模型&#xff0c;这个想法是利用群体的智慧&#xff0c;在给出的最终答案上形成更好的共识。 这种类型的方法已经在监督学习领域得到了广泛的研究和应用&#xff0c;特别是在分类问题上&#xff0c;像RandomForest这样…

RobotFramework常见问题如何解决 ?

附加-问题解决 1. 执行robot用例的时候提示WebDriverException: Message: invalid argument: cant kill an exited process 查看驱动的log是否是提示 如果是的话&#xff0c;参照第七步安装图形界面 2. jenkins启动后发现打不开jenkins页面的问题解决 打开jenkins页面提…

如何使用Cpolar+Tipask,在ubuntu系统上搭建一个私人问答网站

文章目录 前言2.Tipask网站搭建2.1 Tipask网站下载和安装2.2 Tipask网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar临时数据隧道3.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3 Cpolar稳定隧道&#xff08;本地设置&#xff09; 4. 公网访问测试5. 结语 前…