Linux下匿名管道简单模拟进程间通信

news2024/9/23 9:22:59

Linux下匿名管道简单模拟进程间通信

在这里插入图片描述

文章目录

  • Linux下匿名管道简单模拟进程间通信
  • 在这里插入图片描述
  • 1.引言
  • 2.具体实现
    • 2.1创建管道
    • 2.2创建子进程 && 通信(子进程写入)
    • 2.3关闭对应fd
  • 3.结果

1.引言

​ 首先,管道是一种半双工的单向进程间通信方式,也就是说它只能进行一边读一边写的过程,而不能进行同时的读写。其次,管道的思想是让两个或者多个进程看到同一份资源,在公共资源上修改内容从而进行交互的过程。

​ 管道旗下分为两种具体管道: 1.匿名管道 2.命名管道,今天我们本篇就来介绍一下匿名管道!

​ 匿名管道(Anonymous Pipe),是一种只能在具有血缘关系(如:父子进程)的进程间通信的一种管道。可以通过**pipe()**函数来创建,使用read()和write()系统调用接口来读取和发送数据。

在这里插入图片描述

知道了基本知识再结合我们之前的所学习的文件描述符fd的相关知识我们就可以来尝试着简单模拟一下进程间通信了!

​ 对文件描述符有疑惑的请回看我的Linux文件描述符fd的理解

2.具体实现

​ 由于匿名管道只能在具有血缘关系的进程间通信的一种措施,所以我们打算:父子进程来模拟,父进程读取,子进程写入,进行父子进程通信。子进程具体写入的任务就是:定义一个计数器,将计数器++数次后打包交回给父进程,以此来模拟通信过程。

在这里插入图片描述

那么我们具体实现可以分为四步:

1.创建管道

2.创建子进程

3.关闭对应的fd(为了控制读写端)

4.进行通信

2.1创建管道

首先根据上图创建匿名管道pipe(int pipefd[2])函数的使用,定义一个两个数据大小包含fd的数组放入参数部分。

pipefd[0]代表读端,pipefd[1]代表写端

 //1.创建管道
    int pipefd[2] = {0};//创建一个2个大小的整型数组来包含fd
    int n = pipe(pipefd);//pipe函数传数组来接收文件描述符fd  
    if(n < 0)//未能创建输出错误
    {
        std::cout<<"pipe error"<<errno <<":" << strerror(errno)<<std::endl;
        return 1;
    }

2.2创建子进程 && 通信(子进程写入)

通过fork()函数创建完子进程后,我们期望子进程写入,所以在子进程中关闭读端pipefd[0]。

之后设计一个循环将计数器cnt一直作++处理后打包给父进程即可

//2.创建子进程
    pid_t id = fork();
    assert(id != -1); //防止子进程创建失败

    if(id == 0) //进程创建成功:子进程
    {
        //子进程 :子进程写入,那就不要读了,关闭读端
        close(pipefd[0]); 
        //4.开始通信 --结合某种具体场景 
        //这里的场景是:将计数器++完后打包发给父进程
        int cnt = 1;
        while(true)
        {
            const std::string namestr = "hello ,我是子进程,asshole!";
            
            char buffer[1024]; //
            snprintf(buffer,sizeof(buffer),"%s,计数器:%d,我的PPID是:%d\n",namestr.c_str(),cnt++,getpid());
            write(pipefd[1],buffer,strlen(buffer));
            sleep(1);

             
        }




        close(pipefd[1]); //做完后继续关闭写端结束战斗
        exit(0);

    }

2.3关闭对应fd

为了控制读写端,我们父进程关闭写端,子进程关闭读端,然后由父进程通过read接收到write写入的值输出即可。

close(pipefd[1]);//父进程关闭写端

        while(true)
        {
            char buffer[1024];
            
            int  n = read(pipefd[0],buffer,sizeof(buffer)-1);
            if(n > 0) //写成功
            {
                buffer[n] = '\0';
                //std::cout<<"我是父进程,子进程给我消息:"<<buffer<<std::endl;
                printf("我是父进程,子进程给我发消息:%s,我的PID是:%d\n",buffer,getpid());
            }
        }

  
        close(pipefd[0]); //做完后关闭所有端口

3.结果

我们写完后来具体看看结果

在这里插入图片描述

实现完后查看PPID确实是计数器在++,并且父子进程都是匹配的.
说明设置成功!!

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

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

相关文章

有哪些简单的AI绘画软件?

随着人工智能技术的不断发展&#xff0c;越来越多的人工智能绘画软件出现了。人工智能绘画软件利用人工智能技术&#xff0c;通过计算机自动生成或辅助生成艺术作品。人工智能绘画软件通常集成了深度学习、计算机视觉和自然语言处理技术&#xff0c;可以模拟人类的创作过程&…

【数据结构与算法】十大经典排序算法-插入排序

&#x1f31f;个人博客&#xff1a;www.hellocode.top &#x1f3f0;Java知识导航&#xff1a;Java-Navigate &#x1f525;CSDN&#xff1a;HelloCode. &#x1f31e;知乎&#xff1a;HelloCode &#x1f334;掘金&#xff1a;HelloCode ⚡如有问题&#xff0c;欢迎指正&#…

【Shell】基础语法(三)

文章目录 一、Shell基础语法1. 位置参数和特殊变量2. 输入输出3. 管道4. 文件重定向5. 函数6. 脚本调试方法 二、Shell高级和正则表达式1. sort命令2. uniq命令3. wc命令4. grep命令5. find命令6. xargs7. sed命令8. crontab 一、Shell基础语法 1. 位置参数和特殊变量 $0 …

循环队列详解

1. 循环队列 1.1 概念及结构 循环队列是一种特殊类型的队列数据结构&#xff0c;也被称为”唤醒缓冲器“。它在数组的基础上实现了循环利用空间的功能。在循环队列中&#xff0c;队尾和队头之间形成了一个循环&#xff0c;当队尾指针“追上”队头指针时&#xff0c;队列不再继…

IDEA设置Tabs多行显示的方法

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 前言 在开发的时候、不知不觉我们就会打开很多代码页。如果打开的页面…

在线原型设计工具有好用的吗?就是这10个

随着设计工作的不断发展&#xff0c;原型设计在设计工作中越来越重要&#xff0c;而在线原型设计工具在减轻了设计师工作负担的同时也提高了设计师的工作效率&#xff0c;今天本文将为大家推荐10个能在线使用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 …

CDC 数据复制:技术、权衡、见解

推荐&#xff1a;使用NSDT场景编辑器助你快速搭建可编辑的3D应用场景 在本文中&#xff0c;我将定义 CDC 数据复制&#xff0c;简要讨论最常见的用例&#xff0c;然后讨论常见技术及其权衡。最后&#xff0c;我将提供一些我作为数据集成公司Dataddo的首席执行官和创始人所学到…

使用logback异步打印日志

文章目录 一、介绍二、运行环境三、演示项目1. 接口2. 日志配置文件3. 效果演示4. 异步输出验证 四、异步输出原理五、其他参数配置六、源码分析1. 同步输出2. 异步输出 七、总结 一、介绍 对于每一个开发人员来说&#xff0c;在业务代码中添加日志是至关重要的&#xff0c;尤…

CSS:弹性盒子模型详解(用法 + 例子 + 效果)

目录 弹性盒子模型flex-direction 排列方式 主轴方向换行排序控制子元素缩放比例缩放是如何实现的&#xff1f; 控制子元素的对其方式justify-content 横向 对齐方式align-items 纵向 对齐方式 align-content 多行 对齐方式 弹性盒子模型 flex-direction 排列方式 主轴方向 f…

webshell免杀项目-Auto-JSPwebshell(五)

Auto-JSPwebshell/jsp免杀/webshell免杀/自动生成 项目地址&#xff1a; https://github.com/G0mini/Bypass 具体使用请参考&#xff1a; https://mp.weixin.qq.com/s/9-__B0MBRSXHla6O0KU7Gg

PCB制造中铜厚度的重要性

电子产品中的PCB是现代电子设备中不可或缺的一部分。在PCB制造过程中&#xff0c;铜厚度是一个非常重要的因素。正确的铜厚度可以保证电路板的质量和性能&#xff0c;同时也影响着电子产品的可靠性和稳定性。 一般我们常见的铜厚有17.5um&#xff08;0.5oz&#xff09;&#x…

SpringBootWeb案例-准备工作

目录 前言 准备工作 需求&环境搭建 需求 环境搭建 开发规范 Restful开发规范 统一的响应结果 开发流程 前言 根据过往的文章可以知道目前我已经学习完了前端、后端、数据库的基础知识&#xff0c;接下来通过一个基于SpringBoot工程开发的web项目案例。 准备工作 …

来讲一讲面试必问的异步FIFO设计!

异步FIFO设计可以说是数字IC设计工程师面试时必问的一个问题了&#xff0c;也是我们经常使用但是又往往被忽略的一个东西&#xff0c;今天就展开详细说一说不同深度&#xff08;2^N或者非2^N&#xff09;异步FIFO的设计思想&#xff1b; 一&#xff1a;2^N深度异步FIFO设计 1…

Unity开发笔记:截取指定位置含有UI的场景截图并输出

学习记录整理&#xff0c;自用&#xff0c;也希望能帮助到有相同需求的人。 如果直接截全图&#xff1a; string screenshotName "Assets/Textures/UI/20230803/2.png";ScreenCapture.CaptureScreenshot(screenshotName);截取指定位置含有UI的场景截图&#xff1a; …

Therac-25事故:软件缺陷引发的医疗灾难与教训

目录 引言 Therac-25&#xff1a;背景与功能 软件缺陷导致的灾难 Bug原理解析与编程人员的反思 教训与反思 结论 引言 在计算机科技的进步与应用领域&#xff0c;软件的质量和安全性至关重要。然而&#xff0c;历史上曾经发生过一系列令人震惊的事件&#xff0c;突显了软…

培训报名小程序报名功能完善

目录 1 修改数据源2 修改表单3 支付成功时修改状态4 创建报名成功页5 最终的效果总结 目前我们的报名功能已经搭建了一个基础版&#xff0c;后续需要展示用户已经报名的信息&#xff0c;需要添加一个状态来显示用户是否成功付费。 1 修改数据源 打开我们的报名数据源&#xff…

google PGS 下一代id

前言&#xff1a;为了进一步增强用户的隐私及其多平台游戏体验&#xff0c;Play 游戏服务(PGS) 正在推出下一代玩家 ID&#xff0c;用户第一次玩游戏时&#xff0c;他们将始终被分配一个唯一的下一代玩家 ID&#xff0c;无论用户在什么设备或平台上玩游戏&#xff0c;该 ID 都将…

加入[无人驾驶吕同学]Apollo专属课程领礼品啦!

号外号外&#xff0c;无人驾驶吕同学的Apollo领航官专属课程已经上线了。用户完成课程50%即可领取专属福利&#xff08;百度限定鼠标垫、Apollo限量帆布包、Apollo六周年定制钥匙扣、Apollo六周年限定徽章&#xff09;&#xff0c;四种礼品任选其一。 课程链接&#xff1a;htt…

使用 Docker 和 Streamlit 构建和部署 LangChain 支持的聊天应用程序

文章目录 前言聊天应用程序组件和技术LangChain Python框架开放人工智能模型前端 Streamlit UI使用 Docker 进行部署Docker 优化以实现轻量级和快速构建Docker-compose.yaml 文件基础设施Streamlit 公共云谷歌应用引擎使用 Google Cloud Run 部署应用1.启动服务2. 创建角色并将…

水产养殖产量低?教你个万能的方法!

水产养殖业作为重要的食品生产和经济活动之一&#xff0c;为人们提供了丰富的水产品&#xff0c;但如果不加以适当监测和管理&#xff0c;也可能对水质和生态系统造成负面影响。因此&#xff0c;水产养殖用水监测显得尤为重要。 在养殖过程中&#xff0c;水质的优劣直接影响着养…