Linux-进程间通信_管道

news2024/11/28 20:45:18

项目场景:

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

通过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 DEBUG
        cout << "pipefd[0]:"<< pipefd[0] <<endl;
        cout << "pipefd[1]:"<< pipefd[1] <<endl;
    #endif
    int pid = fork();
    assert(pid != -1);
    if(pid > 0)
    {
        //父进程 进行读操作
        //1.关闭写的fd
        close(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.关闭读的fd
        close(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.coloradmin.cn/o/1356709.html

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

相关文章

树莓派外设开发综述及WiringPi库安装

树莓派常用的接口 IO&#xff1a; input&#xff1a; output&#xff1a; PWM&#xff1a; IIC spi uart WiringPi库 树莓派一个非常重要的 WiringPi库&#xff08;Linux下 动态库 ”.so“ 静态库”.a"&#xff09; &#xff08;是一个特定平台&#xff0c;特…

【Jasypt】SpringBoot配置文件加密

1、加密介绍 在yml配置文件中会存在一些敏感数据&#xff0c;比如用户名&#xff0c;密码&#xff0c;第三方应用的密钥等等。这些信息是以明文的形式出现在文件中&#xff0c;存在较大安全隐患。Jasypt&#xff08;Java Simplified Encryption&#xff09;是一个Java库&#…

秋招复习之数组与链表

目录 前言 1 数组 初始化数组&#xff1a; 访问元素 插入元素 删除元素 遍历数组&#xff1a; 查找元素 扩容数组&#xff1a; 数组的优点与局限性 2 链表 初始化链表 插入节点 删除节点 访问节点 查找节点 数组 vs. 链表 常见链表类型 3 列表 初始化列表 访问元素 插入与删…

Vue 单文件组件的基础入门指南

本文是我2年前做的一个学习小demo&#xff0c;在这里分享一下 希望对想要学习Vue的小伙伴能有一丢丢的小帮助~_~ 1 Vue CLI Vue CLI (opens new window)是一个基于Vue.js进行快速开发的完整系统。 这里我使用 Vue CLI 生成了一个Vue项目&#xff0c;命令为&#xff1a;vue cr…

高效工具汇总,让学习和办公飞起来

目录 1、寻找论文&#xff0c;效率很高2、学习各类编程的地方 1、寻找论文&#xff0c;效率很高 AMiner&#xff0c;由清华大学计算机科学与技术系的唐杰教授团队开发的一个显著的学术搜索和挖掘系统。系统提供了一整套功能以协助学术研究&#xff0c;包括研究人员档案、专家搜…

JAVA的引用与C++的指针有什么区别

JAVA的引用与C的指针有什么区别 1. Java值类型与引用类型1.1 变量初始化1.2 变量赋值1.3 函数传参 2. Java数据存储方式2.1 Java局部变量&&Java方法参数2.2 Java数组类型引用和对象2.3 String类型数据 3. Java引用类型3.1 强引用3.2 软引用3.3 弱引用3.4 虚引用 4. JAV…

SpringBoot启动时执行初始化操作还只会用@PostConstruct?进来看看其它方式~

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

网易云商冯旻伟:“大模型是下一代信息系统的大脑”

编者按 AIGC时代&#xff0c;大模型在智能客服领域的应用一直备受关注&#xff0c;其不断演进的技术给用户体验和业务效率带来了全新的可能性。 近日&#xff0c;我们有幸采访了网易云商AI技术线的负责人冯旻伟&#xff0c;深入了解了他们在智能客服方面的创新和实践。从文字交…

grep笔记240103

常用选项&#xff1a;&#xff1a; -i&#xff1a;忽略大小写进行匹配。 -v&#xff1a;反向匹配&#xff0c;只打印不匹配的行。 -n&#xff1a;显示匹配行的行号。 -r&#xff1a;递归查找子目录中的文件。 -l&#xff1a;只打印匹配的文件名。 -c&#xff1a;只打印匹配的行…

打造专属个人或企业知识付费平台,核心功能设计

在当今数字化时代&#xff0c;知识付费市场正在迅速崛起&#xff0c;而私域流量的概念也日益受到重视。私域流量指的是企业通过自有渠道获取的、能够自由支配的流量&#xff0c;这种流量具有更高的用户粘性和转化率。因此&#xff0c;打造一个基于私域流量的知识付费小程序平台…

【响应式编程-03】常见的函数式接口

一、简要描述 使用Lambda的前提 必须有一个函数式接口: 有且只有一个抽象方法的接口 FunctionnalInterface注解 常见的函数式接口 Runnable / CallableSupplier / ConsumerComparatorPredicateFunction 二、代码实现 1、Runnable - RunnableLambda测试类 package tech.flygo.…

VSCode编辑器下载与安装

1、下载 官网下载地址&#xff1a; 打开下载地址&#xff0c;如下图&#xff0c;根据自己的平台选择相应版本下载&#xff08;本文只针对Windows系统的安装&#xff0c;所以下载Windows版的&#xff09;。 点击会自动下载&#xff0c;下载完成文件如下图&#xff1a; 2、安装…

超实用的小红书达人投放策略分析,纯干货

为什么我投放了小红书达人却没有什么效果&#xff1f; 品牌到底应该怎么投放小红书达人&#xff1f; 品牌小红书达人投放怎么去把控和规划&#xff1f; 小红书达人作为品牌方和用户之间的桥梁&#xff0c;直接影响消费决策。达人粉丝数量大&#xff0c;粘性高&#xff0c;很…

市场复盘总结 20240104

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: 方法一:指标选股 select * from dbo.ResultAll where 入选类型 like %指标选股% and 入选日期=20240104;方法二:趋势选股法 1、最低价持续3日上涨 2、均价…

CSS transition详解

文章目录 属性transition-propertytransition-durationtransition-timing-functiontransition-delaytransition 简写属性 方法Element&#xff1a;transitionrun 事件Element&#xff1a;transitionstart 事件Element&#xff1a;transitionend 事件Element&#xff1a;transit…

深入探究:使用大型AI模型的实战指南

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 在今天的技术领域&#xff0c;大型AI模型已成为…

指增的超额来自于哪里,2024的乾坤九法,美股的宏观估值双杀

图片截止到&#xff1a;2024/1/4 上证 周四 -0.43% 市场热点分析 1. 2024元旦后国内外市场都出现了不同程度的下跌。技术面国内市场一直走在72日均线之下&#xff0c;而且没有形成底部&#xff0c;熊市还会延续。宏观方面&#xff0c;12月官方PMI持续向下&#xff0c;小企业更多…

C++_string类

目录 一、string的模拟实现 1、初始化字符串 2、拷贝构造 3、赋值重载 4、迭代器 5、比较字符串 6、尾插字符、字符串 7、resize 8、中间插入数据、删除数据 8.1 插入数据 8.2 删除数据 9、查找数据 10、打印对象&#xff08;流插入、流提取&#xff09; 结语&a…

【企业动态】Silicon Labs中国区总经理拜访东胜物联,加深合作交流

12月27日&#xff0c;芯科科技(Silicon Labs)中国区总经理周巍先生前来我司拜访&#xff0c;东胜物联CEO支江峰先生热情接待&#xff0c;双方就物联网网关、Beacon等产品合作相关事宜进行交流。 在这次重要的会晤中&#xff0c;双方就技术创新以及未来合作方向进行了深入沟通。…

快手推荐算法工程师三面回顾

快手三次技术面试一次HR面试的简单回顾&#xff0c;希望对大家有所启发。 一面 面试官一上来就让写算法题&#xff0c;第一个是计算岛屿数量&#xff0c;第二个是最长回文字串。 然后就是介绍自己的论文。对于论文的工作&#xff0c;面试官只是在问关于论文的问题&#xff0…