Linux-进程之间的通信


目录

​编辑

一.什么是进程之间的通信

二.进程之间的通信所访问的数据

三.进程之间的通信是如何做到的

四.基于内存文件级别的通信方式——管道

        1.什么是管道                

        2.管道的建立过程——匿名管道

                a.什么是匿名管道

                b.匿名管道特点:

                c.使用匿名管道的四种情况:

五.具有血缘关系的进程之间的通信的代码实现

六.使用匿名管道实现简易版本的进程池

七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系

八.命名管道

九.使用命名管道通信并完成程序日志的打印

十.通过system V 共享内存实现的进程之间的通信

        1.什么是system V 共享内存

        2.从共享内存的申请到共享内存的使用

        3.共享内存的释放

        4.问题


一.什么是进程之间的通信

        定义:两个或多个进程之间实现数据层面的交互。

        进程之间的通信实现的成本是很高的,因为我们都知道在操作系统中,进程之间的是有独立性的。

二.进程之间的通信所访问的数据

        1.基本数据

        2.发送命令

        3.某种协议

        4.通知

三.进程之间的通信是如何做到的

        1.进程之间的通信必须让不同的进程之间看到同一份“资源”。

        2.这个“资源”是指特定形式的存储空间。

        3.这个特定形式的存储空间是谁来提供的:

                假设a:如果这个特定的存储空间是由进行通信的双方的其中一方提供的。

                                那么这个资源属于谁?    属于该进程独有的。

                                        那么此时我们在进行进程之间的通信那么势必会破会进程之间的独立性,这是个万万不可以的。

                假设b:如果这个特定的存储空间是又操作系统提供的。

                                在两个进程要发生进程之间的通信时,操作系统会为两者开辟一段第三方空间来满足进程通信的需要。

                                那么访问这个空间,进行通信,本质就是访问操作系统,进程代表的就是用户,“资源”从创建到使用到释放,这一系列过程都是由操作系统来提供系统级别的调用接口的。

                                从底层设计,从接口设计 都是要由操作系统独立设计的。

                                一般的操作系统都是有一个独立的通信模块-隶属于文件系统-----IPC通信模块

        4.关于进程通信是有标准的:system V (本机内部的通信)&& posix(网络之间的通信)。

四.基于内存文件级别的通信方式——管道

        1.什么是管道                

                管道是Linux由Unix那里继承过来的进程间的通信机制,它是Unix早期的一个重要通信机制。其思想是,在内存中创建一个共享文件,从而使通信双方利用这个共享文件来传递信息。由于这种方式具有单向传递数据的特点,所以这个作为传递消息的共享文件就叫做“管道”。

        2.管道的建立过程——匿名管道

                a.什么是匿名管道

        

                        这种使带有血缘关系的进程之间可以通信的管道称匿名管道。

                b.匿名管道特点:
                         只能用于具有共同祖先的进程(具有亲缘关系的进程)之间进行通信;通常,一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道。
                        管道提供流式服务。
                        一般而言,进程退出,管道释放,所以管道的生命周期随进程。
                        一般而言,内核会对管道操作进行同步与互斥。
                                在读取管道的数据后,会将对应的数据变为可覆盖的数据。
                        管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道。

                c.使用匿名管道的四种情况:

                        读写端正常,管道如果为空,读端就会被阻塞。

                        读端慢,写端快

                                会一瞬间将管道文件写满,此时写端会被阻塞,然后读端在自己的用户级缓存区没满的前提下,有多少读多少。

                                管道文件的是有大小的:使用 ulimit -a 指令可以查看重要文件的规定。 

                        其中可以看到这个里面表明管道的大小是4kb,但是实际的管道大小是4kb吗?

                        我们将读端关闭,然后此时一直向管道写入一个字符:

                        我们发现:

                        此时管道文件的大小是64kb。不同的内核平台下这个大小不同

                        如何查看Linux的内核是什么版本:uname -r

                        那么我们上面查到的4kb是什么,实际上在我们进行读写时有一个大小是PIPE_BUF 这个大小是4kb,如果单次写入时写入的数据是小于PIPE_BUF的那么此时读写就是原子的,此时即使管道有数据,但是写端还没有写完,读端也不会从管道中读取数据。

                        读写端不正常

                              读正常,写不正常:

                                        此时读文件时文件中没有数据,read接口会识别到文件的结尾,所以什么都不会读到。

                              写端正常,但是读端关闭:

                                        此时写端在向管道文件中写入数据是没有意义的,而其操作系统也不会允许友这样的行为存在,此时操作系统会像进程发送型号,使进程退出。

五.具有血缘关系的进程之间的通信的代码实现

        Linux-模拟实现基于内存级文件的单向进程通信-CSDN博客

六.使用匿名管道实现简易版本的进程池

        Linux-使用管道实现简易版本的进程池-CSDN博客

七.匿名管道和我们之前在bash命令行中使用的 | 有什么关系

        eg:cat test.txt | head -10 | tail -5

                此时这里使用的管道就是匿名管道,这三个指令在启动为进程后,都有同样的父进程bash。

八.命名管道

        1.什么是命名管道

                命名管道就是创建在当前工作目录的一个系统级文件。

                命名管道是用于没有血缘关系的进程之间的通信,也是单向通信。

        2.如何定义命名管道

                使用mkfifo 加管道名称就可以创建一个命名管道。                

        命名管道和匿名管道除了适用对象不同其他的基本相同。

九.使用命名管道通信并完成程序日志的打印

        Linux-实现小型日志系统-CSDN博客

          

十.通过system V 共享内存实现的进程之间的通信

        1.什么是system V 共享内存

                共享内存就是由操作系统为进程之间想要通信在物理内存上所开辟的一段存储空间。

                

 

        2.从共享内存的申请到共享内存的使用

                a.进程向操作系统发出请求,希望操作系统为它开辟一段共享内存,以满足它通信的需求。

                b.操作系统接收进程发来的请求完成对共享内存的开辟。

                c.操作系统将在物理内存中开辟好的共享内存通过页表和发出请求的进程的进程地址空间进行建立链接。

                d.为了使发出请求的进程可以使用操作系统开辟好的共享内存,在建立关联时操作系统还会将共享内存在进程地址空间中的启始虚拟地址返回给进程。 

        3.共享内存的释放

                首先因该先去关联,然后在使用系统调用接口来释放共享内存。

         

        4.问题

                a.从共享内存的创建到共享内存的管理,都是又操作系统来完成的,为什么不能是进程自己完成。

                        因为共享内存如果是由进程之间创建的话,因为进程有独立性的原因,其他的进程是没有办法去访问它的空间的,此时就没有办法实现进程间的通信了。

                b.系统中会开辟很多的共享内存来实现不同进程之间的通信的需要,所以操作系统会将它们管理起来。  先描述在组织。

        5.代码实现通过system v共享内存实现的进程间的通信

                Linux-代码实现通过system v共享内存实现的进程间的通信-CSDN博客

        

        6.共享内存的特点

                a.共享内存没有同步和互斥的特点。

                b.共享内存是所有的进程之间通信速度最快的。

                c.共享内存中的数据由用户自己管理。

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

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

相关文章

风格迁移网络修改流程(自用版)

一. AdaAttN-Revisit Attention Mechanism in Arbitrary Neural Style Transfer(ICCV2021) 下载vgg_normalised.pth打开visdom python -m visdom.server在 train_adaattn.sh 中配置 content_path、style_path 和 image_encoder_path,分别表…

固态硬盘速度测试:硬盘实际性能是否符合标准?

在进行固态硬盘速度测试之前我们先来了解一下固态硬盘的读写速度是什么。固态硬盘的读写速度主要分为顺序读写和随机读写(4K)。 ​顺序读写:指的是硬盘在读写连贯、集中大文件时候的速度。比如在读取、拷贝单个视频文件时,就是硬盘…

【项目问题解决】IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder()

目录 lombok找不到符号问题修改 1.问题描述2.问题原因3.解决思路4.解决方案5.总结6.参考 文章所属专区 项目问题解决 1.问题描述 IDEA2020.3 使用 lombok 插件 java: 找不到符号 符号: 方法 builder(),无法使用lombok下应有的注解,一度怀疑是版本问题 …

使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹

环境: Inno Setup 6.6 Win10 专业版 问题描述: 使用Inno Setup 打包程序文件 怎么把其中一个文件安装时复制到指定系统文件夹 将文件api-ms-win-shcore-scaling-l1-1-1.dll复制到system32里面 解决方案: 1.由于安全和权限的限制,直接在Inno Setup脚本中复制文件到C:\…

C++新经典模板与泛型编程:用成员函数重载实现std::is_class

用成员函数重载实现is_class std::is_class功能,是一个C11标准中用于判断某个类型是否为一个类类型(但不是联合类型)的类模板。当时在讲解的时候并没有涉及std::is_class的实现代码,在这里实现一下。简单地书写一个IsClass类模板…

python pydoc生成API文档

pydoc是python内置的一个文档生成模块。 pydoc 模块会根据 Python 模块来自动生成文档。 生成的文档可在控制台中显示为文本页面,提供给 Web 浏览器访问或者保存为 HTML 文件。 对于模块、类、函数和方法,显示的文档内容取自文档字符串(即 _…

泰凌微(Telink)8258配置串口收发自定义数据

在官网下载SDK后(以Mesh SDK为例)使用Eclipse打开,对应MCU的配置文件在app_config_8258.h,默认的HCI接口是HCI_USE_NONE,如果改成HCI_USE_UART后可以通过串口收发数据,此时默认接收函数处理的是以Telink的协…

音视频学习(二十)——rtsp收流(udp方式)

前言 本文主要介绍通过udp方式实现rtsp拉流。 流程图 流程说明: 相较于tcp方式“信令数据”复用同一连接拉流,udp方式拉流“信令数据”采用不同的连接,信令传输采用tcp,流数据传输采用udp;客户端向服务端&#xff0…

数据库增删改查(CRUD)进阶版

目录 数据库约束 约束类型 表的设计 1.一对一 2.一对多 3.多对多 增删查改进阶操作 1. 插入查询结果 2.查询 聚合查询 聚合函数 group by having 联合查询 内连接 外连接 自连接 子查询 合并查询 数据库约束 创建表的时候制定的一些规则,在后续…

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于北方苍鹰算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.北方苍鹰算法4.实验参数设定5.算法结果6.参考…

生成式人工智能笔记-AIGC笔记

生成式人工智能笔记-AIGC笔记 十多年前,人工智能还只是一个不被人看好的小众领域,但是现在,它却已经成了街头巷尾的热点谈资,几乎任何事情都可以和人工智能联系在一起。 人工智能包括基础层、技术层和应用层。 基础层是人工智能…

收藏!当今最流行的10 种人工智能算法

人工智能的概念始于1956年的达特茅斯会议,由于受到数据、计算力、智能算法等多方面因素的影响,人工智能技术和应用发展经历了多次高潮和低谷。 2022年以来,以ChatGPT为代表的大模型一夜爆火,它能够基于在预训练阶段所见的模式和统…

Python中如何判断List中是否包含某个元素

更多资料获取 📚 个人网站:ipengtao.com 在Python中,判断一个列表(List)是否包含某个特定元素是常见的任务之一。在本文中,将深入探讨多种判断List成员包含性的方法,并提供丰富的示例代码&…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列(day 13) 前言: 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 🌈 &#x1f50e…

solidity案例详解(六)服务评价合约

有服务提供商和用户两类实体,其中服务提供商部署合约,默认诚信为true,用户负责使用智能合约接受服务及评价,服务提供商的评价信息存储在一个映射中,可以根据服务提 供商的地址来查找评价信息。用户评价信息&#xff0c…

添加新公司代码的配置步骤-Part1

原文地址:配置公司代码 概述 我们生活在一个充满活力的时代,公司经常买卖子公司。对于已经使用 SAP 的公司来说,增加收购就成为一个项目。我开发了一个电子表格,其中包含向您的结构添加新公司代码所需的所有配置更改。当然&…

虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器。 什么是虚拟数据优化器VDO创建VDO设备以节约硬盘空间 了解什么是VDO VDO全称是Virtual Data Optimize(虚拟数据优化),主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2,大小都是10G。file1和 f…

java学习part40collections工具类

162-集合框架-Collections工具类的使用_哔哩哔哩_bilibili 1.collections工具类 感觉类似c的algorithm包,提供了很多集合的操作方法 2.排序 3.查找 4.复制替换 5.添加,同步

Dockerfile详解#如何编写自己的Dockerfile

文章目录 前言编写规则指令详解FROM:基础镜像LABEL:镜像描述信息MAINTAINER:添加作者信息COPY:从宿主机复制文件到镜像中ADD:从宿主机复制文件到镜像中WORKDIR:设置工作目录 前言 Dockerfile是编写docker镜…

Vue 静态渲染 v-pre

v-pre 指令&#xff1a;用于阻止 Vue 解析这个标签&#xff0c;直接渲染到页面中。 语法格式&#xff1a; <div v-pre> {{ 数据 }} </div> 基础使用&#xff1a; <template><h3>静态渲染 v-pre</h3><p v-pre>静态渲染&#xff1a;{{ n…