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<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 pid = fork();assert(pid != -1);if(pid > 0){//父进程 进行读操作//1.关闭写的fdclose(pipefd[1]);//开辟缓冲区char buffer_read[1024];//进行读操作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(pid == 0){//子进程 进行写操作//1.关闭读的fdclose(pipefd[0]);//2.1开辟缓冲区char buffer_write[1024];//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.hqwc.cn/news/321478.html

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

相关文章

【DevOps-03】Build阶段-Maven安装配置

一、简要说明 下载安装JDK8下载安装Maven二、复制准备一台虚拟机 1、VM虚拟复制克隆一台机器 2、启动刚克隆的虚拟机,修改IP地址 刚刚克隆的虚拟机 ,IP地址和原虚拟的IP地址是一样的,需要修改克隆后的虚拟机IP地址,以免IP地址冲突。 # 编辑修改IP地址 $ vi /etc/sysconfig…

动态分区分配算法-第四十四天

目录 前言 首次适应算法&#xff08;First Fit&#xff09; 最佳适应算法&#xff08;Best Fit&#xff09; 最坏适应算法&#xff08;Worst Fit&#xff09; 临近适应算法&#xff08;Next Fit&#xff09; 本节思维导图 前言 动态分区分配算法&#xff1a;在动态分区分…

基于EMD-SpEn(样本熵)联合小波阈值去噪

代码原理 基于 EMD-SpEn&#xff08;样本熵&#xff09;联合小波阈值去噪方法是一种用于信号降噪的信号处理方法&#xff0c;它结合了经验模态分解 (EMD)、样本熵 (SpEn) 和小波阈值处理技术。 首先&#xff0c;使用 EMD 将原始信号分解为一组称为经验模态函数 (IMFs) 的信号…

华为云CES监控与飞书通知

华为云负载均衡连接数监控与飞书通知 在云服务的日常运维中&#xff0c;持续监控资源状态是保障系统稳定性的关键步骤之一。本文通过一个实际案例展示了如何使用华为云的Go SDK获取负载均衡器的连接数&#xff0c;并通过飞书Webhook发送通知到团队群组&#xff0c;以便运维人员…

seo分享:慎重使用蜘蛛池

其实要提高搜索引擎蜘蛛的来访次数&#xff0c;唯一的方法还是要通过网站本身的内容更新。频繁更新有质量的内容&#xff0c;才能够提高蜘蛛的来访次数。如果本身内容更新不多&#xff0c;外部引流的蜘蛛过多&#xff0c;最终发现没什么内容索引&#xff0c;蜘蛛来访的次数也会…

AI:112-基于卷积神经网络的美食图片识别与菜谱推荐

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

SSL/TLS 握手过程详解

SSL握手过程详解 1、SSL/TLS 历史发展2、SSL/TLS握手过程概览2.1、协商交换密码套件和参数2.2、验证一方或双方的身份2.3、创建/交换对称会话密钥 3、TLS 1.2 握手过程详解4、TLS 1.3 握手过程详解5、The TLS 1.2 handshake – Diffie-Hellman Edition 1、SSL/TLS 历史发展 可…

【模拟量采集1.2】电阻信号采集

【模拟量采集1.2】电阻信号采集 1 怎么测&#xff1f;2 测输入电阻电压即转为测模拟电压值&#xff0c;这里需要考虑选用怎样的辅助电阻&#xff1f;3 实际电路分析3.1 在不考虑 VCC-5V 电压的纹波等情况时&#xff08;理想化此时输入的 VCC 就是稳定的 5V&#xff09;3.2 若考…

MySQL之基于代价的慢查询优化建议

1.背景 慢查询是指数据库中查询时间超过指定阈值&#xff08;美团设置为 100ms&#xff09;的 SQL&#xff0c;它是数据库的性能杀手&#xff0c;也是业务优化数据库访问的重要抓手。 如何优化慢查询呢&#xff1f;最直接有效的方法就是选用一个查询效率高的索引。关于高效率…

集合的三种遍历方式

迭代器&#xff08;Iterator&#xff09; 概述&#xff1a;Iterator 是个接口&#xff0c;迭代器是集合的专用遍历方式 使用方法&#xff0c;我们想要使用迭代器&#xff0c;必须首先得到集合对象&#xff0c;通过集合对象生成迭代器对象&#xff0c;才能进行集合的遍历 常用…

大数据毕业设计:租房推荐系统 python 租房大数据 爬虫+可视化大屏 计算机毕业设计(附源码+文档)✅

毕业设计&#xff1a;2023-2024年计算机专业毕业设计选题汇总&#xff08;建议收藏&#xff09; 毕业设计&#xff1a;2023-2024年最新最全计算机专业毕设选题推荐汇总 &#x1f345;感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路&#xff0c;大家在毕设选题&#xff…

[C#]使用onnxruntime部署Detic检测2万1千种类别的物体

【源码地址】 github地址&#xff1a;https://github.com/facebookresearch/Detic/tree/main 【算法介绍】 Detic论文&#xff1a;https://arxiv.org/abs/2201.02605v3 项目源码&#xff1a;https://github.com/facebookresearch/Detic 在Detic论文中&#xff0c;Detic提到…