Linux-进程间通信_管道

项目场景:

须熟知文件管理和进程方面的基础知识

通过Xshell和VScode 相互进行远程开发,学习进程间通信的其中一种方式——管道。


问题描述

依照我们曾经所学的知识,我们仅仅只能在单个进程中进行数据的交互,但是在实际应用中,单个进程不说不能实现一个产品的全部功能,但是会十分糅杂且出现问题很难定位。

而我们从以往学习的知识中,我们了解到进程之间是十分具有独立性的,例如父子进程各自修改重叠数据会有写实拷贝,所以,我们如果要进行进程间通信,其实成本是较为巨大的,但是又是尤为重要。

那么对于以后的开发,我们就要学会多进程乃至多线程通信交互,而今天,我们来学习多进程间通信的第一种方式——管道。


什么是管道

管道,是原生Linux系统提供的一个进程间通信的方式,一般使用于父子进程当中
pipe使用手册
管道的原理就是父子进程打开同一块文件,我们称这个文件叫做"管道"。因为父子进程由于进程的独立性,基本上从数据方面可以说是互不干扰,那么就可以由操作系统帮我们打开一个文件,让父子进程同时看到一块同样的管道文件区域,再通过这个管道文件实现通信。

需要注意的是,管道是单向的,且不止可以仅连接两个进程,可以连接多个进程。

分析:

pipe(管道)

int pipefd[2] = {0};
int ret = pipe(pipefd);

首先我们来看pipe函数的参数,pipefd是一个空间为2的int数组,如果我们在一些编程题网站做过题目,就应该知道“输出型参数”,而这里的pipefd就是充当输出型参数。

输出型参数:将需要从函数内部运行过程中的数据通过输出型参数来获取出来,比如说一个函数可以有返回值,但是我们如果需要从一个函数获取不止一个变量的数据甚至不同类型的数据,那么输出型参数就可以帮我们解决这个问题。

例如这里的pipe函数,我们需要将管道函数帮我们打开的管道通信文件的fd获取,这样我们才可以进行通信


这里的pipefd[0]是代表着管道的读端,pipefd[1]代表着管道的写端
!](https://img-blog.csdnimg.cn/direct/832b48dbdfea47a59232fec7900da244.png)

返回值代表是否成功创建一个管道,如果返回值为-1,则管道创建失败。

使用代码

#include<iostream>
#include<unordered_map>
#include<sys/types.h>
#include<sys/unistd.h>
#include<sys/wait.h>
#include<assert.h>
#include<stdio.h>
#include<unistd.h>
#include<string.h>
using namespace std;
int main()
{int pipefd[2] = {0}; //pipefd[0] 读端  pipefd[1] 写端int ret = pipe(pipefd);assert(ret != -1);#ifdef DEBUGcout << "pipefd[0]:"<< pipefd[0] <<endl;cout << "pipefd[1]:"<< pipefd[1] <<endl;#endifint fd = fork();assert(fd != -1);if(fd > 0){//父进程 进行读操作//1.关闭写的fdclose(pipefd[1]);//开辟缓冲区char buffer_read[1024*8];//进行读操作while(1){int len = read(pipefd[0],buffer_read,sizeof(buffer_read)-1);if(len > 0){buffer_read[len] = '\0';}cout<< "父进程:"<<buffer_read<<endl;}waitpid(fd,nullptr,0);}else if(fd ==0){//子进程 进行写操作//1.关闭读的fdclose(pipefd[0]);//2.1开辟缓冲区char buffer_write[1024*8];//2.2传输的小溪string message = "I am son, i am writing message for father!";//进行写操作int count = 0;while(1){//snprintf 初始化缓冲区snprintf(buffer_write,sizeof(buffer_write),"%s:%d",message.c_str(),++count);//开始向文件缓冲区进行写数据write(pipefd[1],buffer_write,strlen(buffer_write));sleep(1);}exit(0);}return 0;
}

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

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

相关文章

算法第七天-粉刷房子Ⅲ

粉刷房子Ⅲ 题目要求 解题思路 来自[宫水三叶] 动态规划 定义 f[i][j][k] 为开了前i间房子&#xff0c;且第 i 间房子的颜色编号为 j&#xff0c; 前 i 间房子形成的分区数量为 k 的所有方案中的[最小上色成本]。 我们不失一般性的考虑 f[i][j][k] 该如何转移&#xff0c;由…

Sentinel使用

前言&#xff1a; 所有的准备工作都做好了&#xff0c;就可以进入到Sentinel的具体使用上了&#xff0c;这里还需要一个测试工具叫做jmeter&#xff0c;是一个很好的测试工具&#xff0c;专门针对并发的&#xff0c;准备好以后&#xff0c;就可以直接开干了。 一、Sentinel作用…

闲人闲谈PS之五十一——项目物料移动中的2个WBS

惯例闲话&#xff1a;2024年在不知不自觉中已经到来&#xff0c;之前闲人也聊起过2023年是忙碌和收获的一年。今年的任务初步排一下&#xff0c;也基本上排到年底去了&#xff0c;又会是忙碌的一年。虽然忙碌&#xff0c;但是今年对于自己而言&#xff0c;有更加重要的事情要去…

vue3顶部内容固定定位,下面内容可以向上滚动

功能要求&#xff1a;一个div里有两个模块儿&#xff0c;顶部按钮模块儿和下面的内容区域模块儿&#xff0c;顶部按钮模块儿固定在顶部不随滚动条滚动&#xff0c;下面内容区域可以滚动 如图&#xff1a; 思路是&#xff1a; 1、顶部按钮固定定位&#xff0c;会脱离文档流&…

两阶段提交协议三阶段提交协议

两阶段提交协议 分布式事务是指会涉及到操作多个数据库的事务,在分布式系统中&#xff0c;各个节点之间在物理上相互独立&#xff0c;通过网络进行沟通和协调。 XA 就是 X/Open DTP 定义的交易中间件与数据库之间的接口规范&#xff08;即接口函数&#xff09;&#xff0c;交易…

sublime text 打开 txt 文档乱码问题

对于 windows 系统使用系统自带的 txt 编辑工具&#xff0c;默认打开和保存文件的文件的格式是 GBK 或者 GB2312&#xff0c;而 sublime 默认仅支持 utf-8&#xff0c;所以当从 windows 系统拷贝文件在 mac 上浏览有时候会出现乱码的问题&#xff0c;这时候就需要安装插件使 su…

python统计分析——直方图(plt.hist)

使用matplotlib.pyplot.hist()函数绘制直方图 from matplotlib.pyplot as pltdata_setnp.array([2,3,3,4,4,4,4,5,5,6]) plt.hist(fish_data) 下面介绍plt.hist()函数中常用的几个重要参数&#xff08;参数等号后为默认设置&#xff09;&#xff1a; &#xff08;1&#xff0…

Linux基础——进程初识(二)

1. 对当前目录创建文件的理解 我们知道在创建一个文件时&#xff0c;它会被默认创建到当前目录下&#xff0c;那么它是如何知道当前目录的呢&#xff1f; 对于下面这样一段代码 #include <stdio.h> #include <unistd.h>int main() {fopen("tmp.txt", …

Web 自动化测试过程中会遇到哪些问题?

作者&#xff1a;木可 链接&#xff1a;https://www.zhihu.com/question/636965892/answer/3341410674 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Web自动化是指使用测试脚本来自动执行网页上的任务。这包括填…

螺丝厂家:家具螺丝的类型和规格

作为家具厂采购经理&#xff0c;您是否经常对如何选择合适的家具螺钉困惑不已&#xff1f;您想了解不同种类和型号家具螺钉特征和适用场景吗&#xff1f;你想找专业指南来帮助你提升产品质量和稳定性吗&#xff1f;假如你有这些困惑&#xff0c;那么就来对地方了&#xff01; 在…

Python遍历读取 A 文件夹中的 A1、A2、A3、A4、A5 中的各子文件夹中的图片,并对每张图片处理后保存到指定路径

目录 一、具体步骤二、文件夹目录结构样例三、代码四、实例遍历处理后结果五、总结 一、具体步骤 首先&#xff0c;指定 A 文件夹的路径和重命名后的文件夹路径。 然后&#xff0c;遍历 A 文件夹中的各子文件夹。 在每个子文件夹中&#xff0c;遍历所有文件。 读取每个文件&am…

使用 Swagger 导入 Postman: 最佳实践与步骤解析

Swagger和 Postman 都是常用的 API 测试工具&#xff0c;都有各自的优势。为了结合两者的优点&#xff0c;我们可以考虑将 Swagger 中的 API 定义导入到 Postman 中去&#xff0c;这样就可以利用 Postman 更强大的测试功能来测试 Swagger 定义的接口。 下面将以 Swagger Petst…

知虾会员**成为知虾会员,尊享专属权益**

在当今繁忙的生活中&#xff0c;线上购物已经成为现代人们的主要消费方式之一。而作为线上购物平台的领军者之一&#xff0c;Shopee为了提供更加个性化和便利的购物体验&#xff0c;推出了知虾会员&#xff08;Shopee会员&#xff09;服务。知虾会员不仅可以享受到一系列会员专…

LeetCoed刷题:21. 合并两个有序链表

题目&#xff1a; 是否独立解出&#xff1a;否 解题时的思路与想法&#xff1a;解题时有几个问题&#xff1a; 1.怎么遍历两个数组&#xff0c;嵌套两个while循环不能实现&#xff08;后面通过看题解知道list1&#xff01;null&&list2&#xff01;null&#xff09; …

修改 docker /dev/shm 的大小

修改 docker /dev/shm 的大小 1&#xff0c;获取完整id&#xff1a; docker inspect 245| grep Id rootlynxi:~# docker inspect 245| grep Id"Id": "245ab167ed9a79873b31b3a38df2053870fe72f267c3c1a660df25c63e37e88b",2&#xff0c;修改 ShmSize&…

函数模板和类模板(初阶)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生&#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX&#x1f43c;个人WeChat&#xff1a;ILXOXVJE&#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&am…

【springboot配置文件加载源码分析】

在Spring Boot的源码中&#xff0c;配置文件的加载是在应用程序启动的早期阶段进行的。具体来说&#xff0c;配置文件加载的主要步骤发生在SpringApplication类的run()方法中的prepareEnvironment方法中&#xff0c;真正读取我们的配置文件还是PropertySourceLoader。 本篇博客…

哪个牌子最值得购买?好用的洗地机排行榜

随着生活水平的提高&#xff0c;人们对家庭卫生的重视程度也越来越高&#xff0c;家用洗地机成为了现代家庭清洁中不可或缺的一部分。2024年的品牌排行榜也开始逐渐浮出水面&#xff0c;消费者们对于哪个品牌的家用洗地机更值得信赖也开始产生了新的讨论。接下来&#xff0c;让…

跟我用路由器学Linux编程实例四

专栏目录 第一章 简单编程实现花生壳的ddns功能 第二章 让花生壳ddns脚本自动工作 第三章 同时解析多个花生壳域名的脚本 第四章 具有通用性的花生壳ddns脚本 用折腾路由的兴趣&#xff0c;顺便入门shell编程。 第四章 具有通用性的花生壳ddns脚本 文章目录 专栏目录第四章 具…

C语言快速入门——基础知识

C语言基础 C语言基础C程序基本格式基本数据类型原码、反码和补码原码反码补码 整数类型浮点类型字符类型 变量变量的使用无符号数类型转换 运算符基本运算符运算符优先级自增自减运算符位运算符逻辑运算符 流程控制分支语句 - if分支语句 - switch循环语句 - for循环语句 - whi…