Linux(进程间通信)

news2025/4/5 23:51:13

目录:

           1.进程间通信的介绍

           2.管道通信

           3.管道的原理

-------------------------------------------------------------------------------------------------------------------------------

1.进程间通信的介绍

 2.管道通信

当我们在创建子进程时,我们的父进程和子进程是两个独立的进程,它们两个有没有看到同一份资源呢??

看到了,就是一份文件,如果父进程写入自己的数据进对应的缓冲区当中不触发你的磁盘驱动的写入函数刷新到磁盘上,那么是不是另一个进程通过文件描述符找到同一个struct_file然后找到这个缓冲区的数据,是不是可以做到将一个进程的数据交给了下一个进程,这就是叫做让不同的进程看到了同一份资源,这种基于文件的通信方式,就是管道(一个进程往缓冲区里写数据,下一个进程往缓冲区里读数据)

3.管道的原理

 

 但是管道是只能单向通信的通信通道!!!如果想实现双向通信就必须实现两个管道

我们的父子进程看到了同一份的公共资源(指的就是管道),这就是管道原理

为什么最开始的时候父进程在最开始的时候要以写方式和读方式打开一个文件呢??

也就是为什么父进程这里为什么要有两个文件描述符

一个行不行??要是父进程是以读方式打开,那么子进程继承下去就也只能读了,两个读端,父子进程还怎么实现通信!!!

那如果既以写方式和读方式打开呢??(C语言不是有rw方式打开文件嘛!!)

要是读写方式打开的话,只有一个文件描述符,这样子好像可以,可是要怎么关呢??

子进程继承下去也能读能写,可是管道只能是单向通信的,怎么关呢??没办法

 -----------------------------------------------------------------------------------------------------------------------------

操作系统给我们提供一个系统调用,打开一个文件以写方式和读方式打开

 接下来我们代码实现管道通信 -------------------------

 我们管道创建成功了,接下来就是进行父子进程间通信了

我们先fork()创建子进程,之后在关闭读写端,实现单向通信

 我们可以把0想象成嘴,把1想象成笔

------------------------------------------------------------------------------------------------------------------------------

 这样子我们就是实现了让双方进程看到同一份资源

接下来就是通信了

 

上面我就做到了子进程把数据通过管道交给父进程  ---- 这就是管道通信

接下来我们再通过一些代码来推测,管道通信的特性!!

 我们再来模拟一个小现象

 发现当没有人读的时候,写满64kb的时候,写端就不在写入了------因为管道有大小

1024字节=1kb

-------------------------------------------------------------------------------------------------------------------------------

当我们的writer写满的时候,为什么不写了???

因为要让reader读端来读,不写了的本质是:是要等对方来读

那么我们就当写满的时候,再来读看看,通过一段代码来看看

 

 管道自带同步机制  ----  原子性写入

 不仅仅我们的写端等我们的读端,我们的写端也可能等我们的读端---- 自带同步机制

--------------------------------------------------------------------------------------------------------------------------

 如果我们的写端最终关闭了,那么我们的读端在读会读到文件结尾

--------------------------------------------------------------------------------------------------------------------------

 当我们把读端关闭,写端还在写入,此时站在OS的层面,合理嘛???

严重不合理,我们已经没有人读了,你还在写入,本质就是在浪费操作系统的资源,OS会直接终止写入进程!!!!

可是操作系统给目标进程发送信号  SIGPIPE!!

-----------------------------------------------------------------------------------------------------------------------

 

 -----------------------------------------------------------------------------------------------------------------------------

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

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

相关文章

chatgpt赋能python:Python生成pyc文件的介绍

Python生成pyc文件的介绍 Python是一种解释型语言,但是在执行某些操作时,它会生成缓存文件,以便提高执行效率。这些缓存文件以 .pyc 扩展名保存在同一目录中。 在本文中,我们将重点介绍Python生成pyc文件,并探讨它们…

使用Python绘制M2货币供应率曲线

M2广义货币供应量:流通于银行体系之外的现金加上企业存款、居民储蓄存款以及其他存款,它包括了一切可能成为现实购买力的货币形式,通常反映的是社会总需求变化和未来通胀的压力状态。近年来,很多国家都把M2作为货币供应量的调控目…

Fedora安装并配置开启SSH服务相关命令

Ubuntu参考我这篇:虚拟机里安装ubuntu-23.04-beta-desktop-amd64,开启SSH(换源、备份),配置中文以及中文输入法等 一、过程 1、检测是否安装了openssh-server $ rpm -qa | grep openssh-serveropenssh-server-7.9p1-5.fc30.x86_642、如果上…

【web框架】——Django——如桃花来

目录索引 web框架介绍:常见软件的架构:*CS架构:**BS架构:* 网络通信:socket知识复习:*服务端代码逻辑:**客户端代码逻辑:* socket代码演示:*服务端代码演示:*…

chatgpt赋能python:Python生成:深入了解Python编程中的生成

Python 生成:深入了解Python编程中的生成 简介 Python是一门多用途编程语言,广泛应用于 Web 开发,数据分析,人工智能和科学计算等领域。在Python编程中,生成是一个强大而又常用的概念。本文将介绍Python编程中的生成…

如何在华为OD机试中获得满分?Java实现【输入n个整数,输出其中最小的k个】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

Java 的 String、StringBuffer 和 StringBuilder(一文讲透)

提到 String、StringBuffer 和 StringBuilder,就不得不谈及它们的历史,在了解它们的历史之后,我们对它们的理解将更上一级台阶! 发展历史 String 与 StringBuffer 的出现 String 和 StringBuffer 在 Java1.0 中就已经有了&…

chatgpt赋能python:Python自动操作软件:提高工作效率和节省时间的利器

Python自动操作软件:提高工作效率和节省时间的利器 Python是一种高级编程语言,具有易读易用、快速开发、可移植性好、跨平台兼容等优点。它在自动化操作方面具有很大的优势,可以帮助用户实现各种自动化操作,从而为我们的工作提供…

有哪些信息安全/网络安全/渗透测试/众测/CTF/红蓝攻防/漏洞测试等前沿技术/研究/技巧获取渠道?

​前言 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个月内采取不限方式对防守方展开进攻,不管任何手段只要攻破防守方的网络并且留下标记即成功,直接冲到防守方的办公大楼,然后物理攻破…

第2章 Class

Point结构体 //C语言写法 typedef struct point{float x;float y; }Point;Point a; a.x 1; a.y 2; //const表示p指向的对象里的值不能由p指针修改 void print(const Point* p){printf("%d %d\n", p -> x, p -> y); } print(&a);//想实现点的移动&#x…

深入解析OSI七层协议:实现网络通信的基石

目录 引言:详细介绍1. 物理层(Physical Layer)2. 数据链路层(Data Link Layer)3. 网络层(Network Layer)4. 传输层(Transport Layer)5. 会话层(Session Layer…

【章节1】git commit规范 + husky + lint-staged实现commit的时候格式化代码

创建项目我们不多说,可以选择默认的,也可以用你们现有的项目。 前言: git commit 的时候总有人填写一堆花里胡哨乱写的内容,甚至看了commit 的描述都不知道他这次提交到底做了个啥,那我们有没有办法规范大家的commit提…

chatgpt赋能python:Python中的绝对值函数:abs()

Python中的绝对值函数:abs() 在Python中,绝对值函数可以用来计算一个数的绝对值。这个函数名为abs(),它的语法为: abs(x)其中x为需要计算绝对值的数字。 abs()的用法 abs()函数可以计算传入参数的绝对值,并返回一个…

JavaScript实现使用js外链的方式输出一个5行6列的长方形的代码

以下为实现使用js外链的方式输出一个5行6列的长方形的程序代码和运行截图 目录 前言 一、使用js外链的方式输出一个5行6列的长方形(HTML部分) 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 二、使用js外链的方式输出一个5行6列的长方形&…

Solidity基础七

无论风暴将我带到什么岸边,我都将以主人的身份上岸 目录 一、Solidity的单位 1. 货币Ether 2. 时间单位Time 二、地址的形成 三、以太坊的账户 1.内部账户(简称CA) 2.外部账户(简称EOA) 3.内部账户和外部账户…

dom中的事件处理

事件参考 | MDN (mozilla.org) 什么是事件 事件监听方式 直接在html中编写JavaScript代码(了解) <button οnclick"console.log(按钮1发生了点击~);">按钮1</button> DOM属性&#xff0c;通过元素的on.....来监听事件 // 2.onclick属性// function h…

如何在华为OD机试中获得满分?Java实现【任务总执行时长】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

Visual Studio2022编译器实用调试技巧

目录 1.什么是bug 2.调试是什么&#xff1f; 3.debug和release的介绍 4.windows环境调试介绍 4.1 调试环境的准备 4.2 学会快捷键 4.3 调试的时候查看程序当前信息 4.4 查看内存信息 5.如果写出好&#xff08;易于调试&#xff09;的代码 7.编程常见的错误 1.什么是b…

android MutableLiveData与AndroidViewModel避坑小提示,Java

android MutableLiveData与AndroidViewModel避坑小提示&#xff0c;Java import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LifecycleOwner; import androidx.l…

Tomcat部署项目后,验证码不显示问题

在使用Tomcat服务器部署项目后&#xff0c;发现验证码不显示&#xff0c;在浏览器按f12查询后出现以下页面 查看源码发现一切正常 查阅相关资料后&#xff0c;得到以下方法&#xff1a; 1.在tomcat配置文件catalina.sh文件中找到-Djava.io.tmpdir"$CATALINA_TMPDIR" …