【Linux】进程间通信(一)---- 匿名管道

news2024/11/14 21:21:07

【Linux】进程间通信(一)---- 匿名管道

  • 一.序
    • 1什么是进程间通信
    • 2.进程间通信的标准
    • 3.为什么需要进程通信
  • 二.匿名管道
    • 1.原理
    • 2.使用
    • 3.四种情况
    • 4.五个特点

一.序

1什么是进程间通信

进程间通信
通信我们大致知道是啥,就是互相传递信息
那进程间通信,就是进程间相互传递信息了

我们知道信息就是就是数据

我们都知道进程具有独立性
所以我们想要让进程中的一个,将信息直接传递给另一个进程
虽然从理论上讲确实可以,但这样无疑是破坏了进程的独立性

所以操作系统会给在内存中开辟一个公共空间
让这两个进程来进行通信

但是我们想想
进程访问这个空间,进行通信,本质就是访问操作系统
进程对于系统来说就是用户,因为进程是用户来控制的

我们曾经多次提到:操作系统是不会信任用户的
所以操作系统从开辟公共内存到进程的相互通信,都是通过调用系统自己设计的接口来进行的

所以:
一般操作系统会有一个独立的通信模块,隶属于文件系统,叫做IPC通信模块

2.进程间通信的标准

我们知道在计算机行业中,**标准是很重要的,**就像5G的行业标准是华为制定的。

所以为了让不同计算机的不同操作系统的不同文件系统,都能进行通信,所以进程间的通信标准是很重要的。
进程间通信的定制标准system Vposix

3.为什么需要进程通信

1.基本数据
2.发送命令
3.某种协同
4.通知

基于这几种需求,所以创造出了进程通信

其实以前进程间是不会进行通信的
但是人们发现进程通信还挺有必要的
所以进程间通信的产生是历史的必然

二.匿名管道

这个匿名管道就是进程间通信的一种方式,但是也有局限

现在先为大伙带来原理,再带大家来使用

1.原理

这里就得用到博主曾经在FD的图了
在这里插入图片描述
这个是以前在讲文件FD时用到的图

那如果我们这个时候fork一个子进程会怎么样呢

我们知道子进程fork的时候,子进程会获得与父进程相同的虚拟地址空间的副本,使子进程拥有与父进程相同的代码、数据和堆栈。

这个时候看看上面的图:
我们知道这个struct taskstruct files_struct

所以他们也会被子进程进行复制

在这里插入图片描述
我们知道左边的部分是这样被子进程复制的

那么问题来了,右边的打开的文件需不需要被复制呢

在这里插入图片描述

这个答案肯定是否定的,因为右边两个被子进程复制走
因为他们都是父进程的一部分,但是打开的文件就不一样了
因为打开的文件和进程是平级的,并不是与进程的一部分

所以是这样的
在这里插入图片描述

所以,利用这个特性,我们就能来创建我们的匿名管道了

在这里插入图片描述

我们打开一个buffer缓冲区(实际上就是一个内存级文件)

这个时候如果fork一下呢?

在这里插入图片描述

就会变成这样

这个时候其实我们就能发现了,这两个进程已经能进行双向通信了

但是看看我们这个叫啥
匿名管道,管道两个字就注定了,它只进不出

因为如果子进程和父进程都同时进行读和写的话
谁能保证父进程写完,会被父进程读走呢?
所以为了确保通信的稳定性和便于实现性
所以这里就要:
关掉父进程的读或者子进程的写
或者关掉父进程的写或者子进程的读

让它变成单向通信。

在这里插入图片描述
在这里插入图片描述

这里就是匿名管道的原理了

2.使用

这里我们已经把管道的原理给讲明白了
接下来就是使用了

之前提过:操作系统是不会信任用户的
所以操作系统从开辟公共内存到进程的相互通信,都是通过调用系统自己设计的接口来进行的

所以这里就要解释接口了

int pipe(int pipefd[2]);

在这里插入图片描述

pipe是起这个作用的

接下来就带大伙来试一下匿名管道通信

#include<unistd.h>
#include<iostream>
#include <sys/types.h>
#include <sys/wait.h>
#include <cstdio>
#include <cerrno>
using namespace std;
void child_write(int pipefd[2])
{
    const char * buffer="my dad";
    int cnt=2;
    while(cnt--)
    {
       write(pipefd[1],buffer,sizeof(buffer));
       cout<<"write success"<<endl;
    }
    

}
void father_read(int pipefd[2])
{
    char buffer[1024];
    while (true)
    {
        ssize_t bytesRead = read(pipefd[0], buffer, sizeof(buffer) - 1); // 留出一个字节存放字符串结束符
        if (bytesRead == 0)
            break;
        buffer[bytesRead] = '\0'; // 手动添加字符串结束符
        cout << buffer << endl;
    }
}
int main()
{
    int pipefd[2];
    if(pipe(pipefd)==-1)
    {
        perror("pipe失败");
        return 0;
    }
    pid_t id=fork();
    if (id < 0) 
    {
    perror("fork");
    return 1;
    } 
    // 子进程
    else if(id == 0) 
    {
       //这里就实现子进程写,父进程读把
        close(pipefd[0]);
        //子进程读
        child_write(pipefd);
        //写完,关闭通道
        close(pipefd[1]);
    } 
    // 父进程
    else 
    {
        close(pipefd[1]);
        //父进程写
        father_read(pipefd);
    }


        //读完,关闭通道
        close(pipefd[0]);
        
        //回收子进程
        int status;
        if(wait(&status)>0)
        cout<<"wait success\n"<<endl;

}

在这里插入图片描述

这样就完成了通信

3.四种情况

管道的四种情况:
1.读写端正常,管道如果为空,读端就要阻塞
管道没有接受到数据,读端就会一直等待数据

2.读写端正常,管道如果满,写端就要阻塞
管道满了,读端没有读数据,数据就堵在管道了,写端无法继续写

3.写端退出,读端正常,读端读到0,不会阻塞
这是因为读端正常,写端没数据了,这个时候代表是正常读写完成。

4.读端退出,写端正常,会把写端关闭
因为操作系统不让做一些浪费性能的事情,已经没有人读取你的数据了,那你就没有继续写的必要了,系统会自己把写端关闭

4.五个特点

匿名管道的五个特点;

1.管道本质是内存级文件,寿命周期是进程
这个是肯定的,管道本来就是为了通信存在的,父子进程通信完毕,自然也就关闭了

2.管道只能单向通信
这个最前面我们也提到过

3.具有血缘关系(常见的是父子)的进行进程间通信
因为我们利用的就是父子进程fork后复制files struct的原理
其实爷孙进程也可以用,只不过常见的是用在父子而已

4.管道是面向字节流的
这个还不太好解释,之后的博客会有解释

5.父子进程会进程协同,同步与互斥的
这个也不太好解释,之后博客也会进行解释

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

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

相关文章

探索智慧生活:百度Comate引领人工智能助手新潮流

文章目录 百度Comate介绍1. 什么是百度Comate&#xff1f;主要特点 2. Comate的核心功能智能问答功能语音识别功能语音助手功能个性化服务 3. Comate 支持哪些语言&#xff1f; 使用教程(以vscode为例)1. 下载和安装Comate3. 常用操作快捷键(windows) 使用体验自然语言生成代码…

【全开源】国际版JAVA多商户运营版商城系统源码地摊兄源码多商户源码社交电商源码支持Android+IOS+H5

国际版多商户运营版商城系统&#xff1a;打造全球电商新生态 随着全球化趋势的深入发展&#xff0c;跨境电商已成为推动世界经济增长的重要力量。为了满足不同国家、地区商户的多样化需求&#xff0c;我们隆重推出“国际版多商户运营版商城系统”&#xff0c;旨在为全球商户搭…

天锐绿盾 | 如何防止电脑内文件遭到泄露?

天锐绿盾是一款专为企业设计的数据防泄漏软件系统&#xff0c;它通过一系列综合性的安全措施来有效防止电脑内文件遭到泄露。 PC地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是天锐绿盾防止文件泄露的主要功能和方法&a…

性价比王者HUSB237,极简PD Sink的“瘦身秘籍”

在小型化、高集成的要求下&#xff0c;慧能泰取电芯片进行技术升级后“瘦身成功”&#xff0c;推出最新一代极具性价比的最简PD Sink取电芯片——HUSB237。 图1&#xff1a;HUSB237 demo及封装图 HUSB237 是一款极具性价比的最简PD Sink取电芯片&#xff0c;支持PD3.1协议包含…

IT行业的现状、未来发展趋势及无限可能

不可能的可能 一、引言二、IT行业的现状三、IT行业的未来发展趋势四、结语 一、引言 在全球化浪潮的推动下&#xff0c;IT行业正以前所未有的速度发展&#xff0c;成为推动全球经济和社会进步的重要引擎。云计算、大数据、人工智能、物联网、5G通信和区块链等技术的不断涌现&am…

【软考】设计模式之组合模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 优点6. 缺点7. java示例 1. 说明 1.将对象组合成树型结构以表示“部分-整体”的层次结构。2.Composite使得用户对单个对象和组合对象的使用具有一致性。3.组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式 …

玩转大模型 企业AI着陆新正解 神州问学AI原生赋能平台正式发布

在人工智能技术日新月异的今天&#xff0c;神州数码凭借深厚的行业洞察和技术积累&#xff0c;揭开了AI原生赋能平台——神州问学的神秘面纱。作为企业AI着陆的加速引擎&#xff0c;神州问学致力于通过AI原生场景赋能&#xff0c;为企业开辟一条通往智能未来的坦途。 神州问学—…

【全开源】JAVA城市向导同城达人系统源码支持微信小程序+微信公众号+H5+APP

城市向导同城达人系统&#xff1a;探索城市的新视角 随着城市化进程的加快&#xff0c;人们对于城市的了解和探索需求日益增长。为了满足这一需求&#xff0c;我们精心打造了城市向导同城达人系统&#xff0c;旨在为广大市民和游客提供一个全面、便捷、有趣的城市导览平台。 …

【git】通过JetBrains IDE对git的操作

应该适用于所有jetbrains产品。 一、拉取(pull)代码 上方工具栏-Git-克隆。然后填写git地址与本地存放地址。 二、搁置 修改代码后搁置代码&#xff08;不提交&#xff0c;但是也不撤销已修改的代码&#xff0c;把它暂存起来&#xff09;。 界面的左上角。1->2->3。…

【MIT 6.5840(6.824)学习笔记】分布式系统介绍

1 概念 当我们谈论分布式系统时&#xff0c;我们指的是一组通过网络连接的计算机&#xff0c;它们协同工作以完成某种共同的任务或目标。 在分布式系统中&#xff0c;通信是通过消息传递进行的。这意味着各个计算节点之间通过发送和接收消息来进行通信&#xff0c;而不是通过…

系统思考—团队学习

结束昨日435期JSTO“探索学习的新视界&#xff1a;硬核工具分享”&#xff0c;有伙伴分享的提升效率的AI工具&#xff0c;也有自我发现团队问题解决的工具&#xff0c;伙伴们都在各自的领域实践、吸收、反馈、复盘。这次的团队学习不仅是知识的传递&#xff0c;更是一场脑力激荡…

Linux修炼之路之gcc/g++,动静态链接及动静态库

目录 一&#xff1a;Linux编译器-gcc/g 预处理-编译-汇编-链接 1.预处理 2.编译 (生成汇编) 3.汇编(生成机器可识别代码) 4.链接(生成可执行文件或库文件) 三:动静态链接和动静态库 动静态库 动静态链接 1.动态链接 2.静态链接 3.注意点 4.各自优缺点 5.ldd和fil…

20240514基于深度学习的弹性超材料色散关系预测与结构逆设计

论文&#xff1a;Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI&#xff1a;https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能&#xff0c;保证了各种各样的具…

安防视频汇聚/智能分析云平台EasyCVR调用localfile接口会返回日志的问题该如何解决?

视频汇聚/安防视频融合云平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备&#xff0c;平台能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理。视频监控/集中存储系统EasyCVR平台可支持国…

QCustomPlot - 柱状堆积图

参考链接 显示柱状图的值 QCustomPlot下载 下载地址&#xff1a;https://www.qcustomplot.com/index.php/download选择版本2.1.0 QCustomPlot.tar.gzQCustomPlot 的使用 解压下载的文件 把qcustomplot.h和qcustomplot.cpp放到自己的项目工程&#xff08;复制文件并qt 的目录…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中&#xff0c;有几位关键人物为它们的诞生和推广做出了重要贡献。 首先&#xff0c;肯汤姆森&#xff08;Ken Thompson&#xff09;是一位在AT&T公司工作的员工&#xff0c;他不仅发明了B语言&#xff0c;还创造了Unix系统。…

Window下安装kettle并配置MySQL驱动,实现表输入输出

一. 安装并配置Java环境 1、JDK下载地址&#xff1a;Archived OpenJDK GA Releases 2、根据自己的需求选择版本进行下载并解压&#xff0c;我这里安装的是JDK21。 然后解压出来放到指定文件夹&#xff0c;我的地址是&#xff1a;C:\Program Files\Java 3、配置环境变量 Win菜…

怎么看电脑是固态还是机械硬盘?数据丢失怎么办

在数字化时代&#xff0c;电脑硬盘作为数据存储的核心部件&#xff0c;其类型直接关系到数据读写速度和存储效率。固态硬盘&#xff08;SSD&#xff09;与机械硬盘&#xff08;HDD&#xff09;作为目前市场上主流的两种硬盘类型&#xff0c;各有其优缺点。然而&#xff0c;对于…

Vue3 - 项目配置多环境配置文件

最常见的多环境配置,就是开发环境配置,和生产环境配置(也就是上线的配置),很多情况下我们开发环境下的域名,和一些配置项,和我们生产模式下的不同,这个时候就需要我们进行多环境配置,不然每次发版都要改一波数据多麻烦。 另一种情况就是你两个项目是用的一套代码,但是最…

青岛东软载波子公司东软载波微电子授权世强硬创代理,出货量累计超20亿颗

凭借业内独特的互联网推新模式&#xff0c;世强先进&#xff08;深圳&#xff09;科技股份有限公司&#xff08;下称“世强先进”&#xff09; 获得本土工业MCU企业——上海东软载波微电子有限公司&#xff08;下称“东软载波微电子”&#xff0c;英文&#xff1a;essemi&#…