匿名管道通信

news2024/11/26 14:52:48

目录

一、进程通信原理

二、什么是管道

三、创建一个匿名管道

四、fork共享管道的原理

五、管道的特点

六、4中场景


一、进程通信原理

我们知道进程间相互独立,具有独立性。那么我们要实现两个进程之间的通信就需要,让这两个进程看到同一个文件。然后一个进程对文件写入,一个进程对文件内容进行读取,这就是现实了进程间的通信。

二、什么是管道

管道是进程间通信的一种方式。

进程间通信的方式:

管道:

  • 匿名管道
  • 命名管道

System V

  • System V 消息队列
  • System V 贡献内存
  • System V 信号量

POSIX IPC

  • 消息队列
  • 共享内存
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

我们把一个进程连接到另外一个进程的数据流成为一个“管道”

Linux中的|就是管道。

三、创建一个匿名管道

#include<unistd.h>

int pipe(int fd[2]);
//fd:文件描述符数组
//返回值:成功返回0,失败返回错误代码。

 此时就创建除了一个有读写权限的数据流。这里只有一个进程,管道还无法实现通信,下文会自习讲解。

四、fork共享管道的原理

这就是实现一个管道通信的原理:

1.父进程先通过pipe创造一个匿名管道

2.父进程再通过fork创建一个子进程,(重点:子进程继承了父进程的fd文件描述符)

3. 父进程保留读端,子进程保留写端

4.这样就实现了:子进程写入,父进程读出的进程通信。

通过文件描述符,深度理解管道:

 以下是进程间通信实例:

#include<unistd.h>
#include<stdlib,h>
#include<stdio.h>
#include<errno.h>
#include<string.h>
#include<assert.h>

#define ERR_EXIT(m) do{
    perror(m);
    exit(EXIT_FAILURE);
}while(0);

int main(int argc,char *argv[])
{
    int piprfd[2];//输出型参数 ,会返回两个文件描述符
    if(pipe(pipefd)==-1)
    ERR_EXIT("pipe error");//也可以这样写:cout<<pipe(pipefd);return 1;
    pid_t pid;
    pid=fork();
    assert(pid!=-1);//意料之外用if意料之内用assert
    if(pid==0)//子进程
    {
        close(pipefd[0]);
        write(pipefd[1],"hello",5);
        close(pipefd[1]);
        exit(EXIT_SUCCESS);
    }

    close(pipefd[1]);
    char buf[10]={0};
    read(pipefd[0],buf,10);
    printf("%s",buf);
    return 0;


}

上面的pipefd数组为输出型参数,pipe函数会将被使用的文件标识符写入这个数组。

记住一般来说:

pipefd[0]为写端。 

pipefd[1]为读端。

五、管道的特点

  1. 管道是单向通信的
  2. 管道的本质是文件,符合Linux下一切皆文件的设计理念。因为fd的生命周期是随进程的,所以管道的生命周期是随进程的。
  3. 通常需要有血缘关系的进程进行管道通信,比如:父子、兄弟、爷孙。因为这样才能继承指向同一个匿名管道的指针。与之相对的有命名管道,后续会详细介绍。
  4. 在管道通信中,写入的次数不一定与读取的次数,不是强相关的。

以下面这个为例子:

        while(true)
        {
            char a= 'x';
            
            write(pipefd[1],&a,1);
        }

这个是写端的代码。一次写入一个x。

    while(true)
    {
        int n=read(pipefd[0],buffer,sizeof buffer-1);
        if(n>0)
        {
            buffer[n]='\0';
            std::cout<<"child give me message:"<<buffer<<std::endl;
        }
    }

这个是读端的代码。

这样的运行结果是:

如图所示:可以看出,有时候写端写了很多次才会读,有时候写端写了三次就读取数据了。

这说明,一个进程重载读取管道中数据的时候是一次将管道中数据的数据全部读取出来的。而且我们也看得出读端的速度比写端的慢很多。 

5.具有一定的协同能力,让reader和writer能够按照一定的步骤通信——自带的同步机制。

六、4中场景

  1. 如果我们read了所有的管道数据,如果对方不发,我就只能等待。
  2. 如果write把管道写满了,就不能继续写了。
  3. 如果我们关闭了写端,读取完管道数据,然后再读就会返回0,表明读到了文件结尾。
  4. 写端一直写,但是把读端关闭,os就会把进行写的程序(通过信号)直接杀死,因为os不会维护一个没有意义的进程。(没有读端,写端也就没有了意义了)。

场景三实例讲解:

            char a[]="abcdefg";
            write(pipefd[1],a,sizeof(a));
            sleep(3);
            close(pipefd[1]);

这里是负责写入的进程,对管道进行了写入,并在写入后3s关闭写端。

    while(true)
    {
        int n=read(pipefd[0],buffer,sizeof buffer-1);
        if(n>0)
        {
            buffer[n]='\0';
            std::cout<<"child give me message:"<<buffer<<std::endl;
        }
        else if(n==0)
        {
            std::cout<<"我读到了文件结尾"<<std::endl;
            break;
        }

    }

这里是负责读取的父进程,当读取到文件结尾时就爱给你退出进程。

一下是运行结果:

 

 

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

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

相关文章

设计模式-访问者模式

访问者模式 问题背景解决方案&#xff1a;传统方案 访问者模式基本介绍原理UML类图 使用访问者模式解决问题UML类图示例代码运行结果 注意事项和细节 问题背景 我们来制作一台电脑&#xff0c;他的硬件有CPU和磁盘&#xff0c;CPU和磁盘类都有一个常量作为他们各自的数据&…

java企业级信息系统开发学习笔记10 利用MyBatis实现关联查询

文章目录 一、学习目标&#xff08;一&#xff09;针对三张表关联查询&#xff08;二&#xff09;按班级编号查询班级信息&#xff08;三&#xff09;查询全部班级信息 二、创建数据库&#xff08;一&#xff09;创建教师表&#xff08;二&#xff09;创建班级表&#xff08;三…

Linux系统搭建Java的运行环境

目录 JDKTomcatMySQL JDK 对于Linux安装JDK有很多方法~ 这里就掌握最简单的办法—基于yum来进行安装~ yum是“包管理器”&#xff0c;相当于应用商店~ 首先&#xff0c;先搜索一下&#xff0c;看看yum上关于jdk有没有&#xff0c;以及叫啥名字~ 通过 yum list命令&#xff0…

六一亲子嘉年华 | 来迅镭激光过一个五彩缤纷的儿童节!

童年是梦&#xff0c;如七彩的画卷&#xff1b; 童年是诗&#xff0c;如璀璨的星空&#xff1b; 童年是歌&#xff0c;如跳跃的音符&#xff01; 在“六一”儿童节到来之际 为给员工及子女创造一个难忘的亲子时光 迅镭激光开展了六一亲子嘉年华主题活动 让孩子们在迅镭大家庭的…

Minigpt4实战搭建

简介 Minigpt4虽然放出了网页版但是使用后发现网页体验的话&#xff0c;由于并发量比较大&#xff0c;很容易突然卡顿的现象&#xff0c;所以下面我主要讲解一下如何进行本地部署。 之前文章已经介绍过Minigpt4了这里就不重复赘述了&#xff0c;不了解的可以去看看https://bl…

使用python开发“魂斗罗”游戏

使用python开发“魂斗罗”游戏 开发完整的魂斗罗&#xff08;Contra&#xff09;游戏是一个庞大的任务&#xff0c;它涉及到图形渲染、物理碰撞、敌人AI、游戏关卡等多个方面。在这个简短的交互中&#xff0c;我将向你展示一个基本的魂斗罗风格的游戏框架&#xff0c;你可以在此…

结构化文档发布的故事和性能调优

前阵子一个TW朋友跟我抱怨他们的文档发布很慢。正常发布需要一个晚上才能完成发布。中间如果出点错&#xff0c;就得重新发布&#xff0c;那么中间是漫长的等待。 不像MS Word或者InDesign这样所见即所得的软件&#xff0c;结构化文档源文件是XML格式的&#xff0c;就像计算机…

C语言——数据在内存中的存储(下)

数据在内存中的存储&#xff08;下&#xff09; 1. 浮点数在内存中的存储 浮点数家族&#xff1a; float double long double 浮点数的表示范围&#xff1a; 这里要引用float.h头文件 【实例一】 //输出结果是什么&#xff1f; int main() {int n 9;float *pFloat (float…

【代码规范】Google开源项目风格指南

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于Google开源项目风格指南进行的&#xff0c;每个知识点的修正和深入…

基于卡尔曼滤波实现线性目标跟踪

文章目录 前言卡尔曼滤波基本推导运算 实现目标检测卡尔曼预测器ID分配器&#xff08;跟踪器&#xff09; 完整代码代码总结 前言 一个需求&#xff0c;在一个稳定的场景当中&#xff0c;实现目标检测计数算法。 任务点&#xff1a; 实现目标检测完成对不同类别的物品进行计数…

Three.js--》实现3d字体模型展示

目录 项目搭建 初始化three.js基础代码 设置环境纹理 加载字体模型 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还是借助框架书写…

前后端交互模型http协议Ajax简介

0、前言&#xff1a;本文只是对“前后端交互模型&http协议&Ajax简介”当中的理论&#xff0c;作用&#xff0c;方法进行总结说明&#xff0c;用于回顾知识&#xff0c;做概括总结&#xff0c;没有具体实现代码。 1、前后端交互模型&#xff1a; 前端发送请求&#xff…

信号机制上(信号概念、发送、定时器、信号捕捉、SIGCHLD)

一、信号机制 概念&#xff1a;信号是在软件层次上对中断机制的一种模拟&#xff0c;是一种异步通信方式 所有信号的产生及处理全部都是由内核完成的 信号的产生&#xff1a; 1 按键产生 2 系统调用函数产生&#xff08;比如raise&#xff0c; kill&#xff09; 3 硬件异…

连接MQTT服务端

MQTT客户端之间要想实现通讯&#xff0c;必须要通过MQTT服务端。因此MQTT客户端无论是发布消息还是订阅消息&#xff0c;首先都要连接MQTT服务端。 MQTT客户端连接服务端一共有两步。 第一步&#xff08;CONNECT请求&#xff09; 首先MQTT客户端将会向服务端发送连接请求。该…

HBase 的关键流程解析

前言 本文隶属于专栏《大数据技术体系》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见大数据技术体系 正文 HBase 客户端会将查询过的 HRegion 的位置信息…

【Python爬虫】采集电商商品评价信息

目录 一、数据采集逻辑二、数据Schema三、数据爬取1.导入库2.对爬虫程序进行伪装3.抓取商品评论信息4.防止反爬&#xff0c;每爬取一页数据后&#xff0c;设置程序休眠环节 四、数据存储1. 存储到csv 2.存储到数据库 一、数据采集逻辑 在进行数据采集之前&#xff0c;明确哪些…

Linux下C语言文件描述符操作(dup / dup2 / sendfile / splice / tee)

Linux的哲学是一切皆文件&#xff0c;而操作文件是通过文件描述符来进行。本文梳理一下dup / dup2 / sendfile / splice/ tee函数对文件描述符的操作。 目录 1.dup 2.dup2 3.sendfile 4.splice 5.tee 1.dup #include <unistd.h> int dup(int fd); 复制一个现有的…

Java基础(maven)——maven新建项目 常用IO工具 Durid数据库工具 案例

目录 引出用Maven建项目0.Maven配置方式1.io流的工具IOUtils/FileUtils1&#xff09;可以读文件、按照行读、读网页等&#xff1b;2&#xff09;配合hasmap进行简体繁体转换 2.durid数据库连接工具1&#xff09;创建连接&#xff0c;durid进行连接管理2&#xff09;查询的方式q…

chatgpt赋能python:Python中的转置函数-一种简单而高效的矩阵操作

Python中的转置函数 - 一种简单而高效的矩阵操作 作为一名10年的Python编程经验工程师&#xff0c;掌握利用Python进行矩阵操作是必不可少的。Python中提供了各种高效的矩阵操作功能&#xff0c;其中之一就是转置函数。 什么是转置&#xff1f; 在数学中&#xff0c;矩阵转置…

追寻幸福:探索幸福的关键特征和行为

目录 1. 积极的心态 2. 良好的人际关系 3. 自我接纳和自尊 4. 追求意义和目标 5. 健康的身心状态 6. 感知和实现个人价值 幸福是一个主观的感受&#xff0c;因此不同的人对于幸福的定义和追求方式可能会有所不同。然而&#xff0c;有一些共同的特点和行为模式&#xff0c…