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.共享内存中的数据由用户自己管理。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Peter算法小课堂—贪心算法

课前思考:贪心是什么?贪心如何“贪”? 课前小视频:什么是贪心算法 - 知乎 (zhihu.com) 贪心 贪心是一种寻找最优解问题的常用方法。 贪心一般将求解过程分拆成若干个步骤,自顶向下,解决问题 太戈编程第…

邮政单号查询,邮政快递物流查询,并进行提前签收分析

批量查询邮政快递单号的物流信息,并将提前签收件分析筛选出来。 所需工具: 一个【快递批量查询高手】软件 邮政快递单号若干 操作步骤: 步骤1:运行【快递批量查询高手】软件,第一次使用的朋友记得先注册&#xff0c…

关于svn如何上传一个完整的项目

注意:请一定要按照该步骤进行操作,请上传新项目时将项目名称进行规范命名 例如原始文件是arrange_v2 将此项目需要注入新的医院 则命名为 arrange_某医院名称_门诊或者医技或者药房_v2 重新命名文件夹名称快捷键 (F12) 一 &…

【Linux】公网远程访问AMH服务器管理面板

目录 1. Linux 安装AMH 面板2. 本地访问AMH 面板3. Linux安装Cpolar4. 配置AMH面板公网地址5. 远程访问AMH面板6. 固定AMH面板公网地址 AMH 是一款基于 Linux 系统的服务器管理面板,它提供了一系列的功能,包括网站管理、FTP 管理、数据库管理、DNS 管理、…

UI自动化测试工具的定义及重要性

UI自动化测试工具在现代软件开发中起着不可或缺的作用。它们能够提高测试效率、减少人为错误、提供全面的测试覆盖,并支持持续集成。通过有效使用UI自动化测试工具,开发团队可以提高软件质量,提供更可靠的应用程序,满足用户的需求…

Jsoup爬取HTTPS页面数据资源,并导入数据库(Java)

一、实现思路 示例页面: 2020年12月中华人民共和国县以上行政区划代码 忽略https请求的SSL证书通过Jsoup获取页面标签遍历行标签,分别获取每个行标签的第二个和第三个列标签将获取到的行政代码和单位名称分别插入sql语句占位符执行sql语句&#xff0c…

掌汇云 | 全场景数据追踪,多维了解用户偏好,提高运营效率

掌汇云拥有黄金“三件套”:掌头条、汇互动、云品牌。群硕借助这些功能套件,面向细分领域如:会展,食品饮料、医药以及工业等,定制综合性信息服务平台,提供资讯、商机、企业人脉、上下游资源、活动等高质量服…

<软考>软件设计师-3程序设计语言基础(总结)

(一) 程序设计语言概述 1 程序设计语言的基本概念 1-1 程序设计语言的目的 程序设计语言是为了书写计算机程序而人为设计的符号语言,用于对计算过程进行描述、组织和推导。 1-2 程序语言分类 低级语言 : 机器语言(计算机硬件只能识别0和1的指令序列)&…

docker网络【重点】

一、网络知识 1、桥接模式:用于链接两个不同网络段的设备,是共享通信的一种方式 2、桥接设备:工作在OSI模型的第二层(数据链路层)。根据MAC地址转发数据帧,类似于交换机,只能转发同一网段&…

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

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

Mysql综合案例练习<1>

MySql综合案例练习<1> 题目一题目二题目三题目四题目五题目六题目七题目八题目九题目十题目十一题目十二题目十三题目十四题目十五题目十六题目十七题目十八题目十九 题目一 创建数据库test01_library 创建表 books&#xff0c;表结构如下&#xff1a; CREATE DATABASE …

Tap虚拟网卡

1 概述 Tap设备通常用于虚拟化场景下&#xff0c;其驱动代码位于drivers/net/tun.c&#xff0c;tap与tun复用大部分代码&#xff0c; 注&#xff1a;drivers/net/tap.c并不是tap设备的代码&#xff0c;而是macvtap和ipvtap&#xff1b; 下文中&#xff0c;我们统一称tap&#…

了解Linux网络配置

本章主要介绍网络配置的方法。 网络基础知识 查看网络信息 图形化界面修改 通过配置文件修改 命令行管理 11.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS。 11.1.1 IP 地址 在计算机…

0010Java安卓程序设计-ssm基于安卓的掌上校园系统

文章目录 **摘要**目录系统实现5.2管理员功能模块开发环境 编程技术交流、源码分享、模板分享、网课分享 企鹅&#x1f427;裙&#xff1a;776871563 摘要 随着Internet的发展&#xff0c;人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化&#xff0c;…

【Java系列】函数式接口编程

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【redis笔记】redis应用

redis应用 redis 发布订阅 redis客户端可以订阅任意数量的频道 订阅方式 subscribe channel1 – 订阅了channel1频道 发布方式 订阅了之后&#xff0c;可以在任意客户端发布消息到指定channel publish channel1 hello – 往channel发布hello&#xff0c;会返回订阅channe…

class036 二叉树高频题目-上-不含树型dp【算法】

class036 二叉树高频题目-上-不含树型dp code1 102. 二叉树的层序遍历 // 二叉树的层序遍历 // 测试链接 : https://leetcode.cn/problems/binary-tree-level-order-traversal/ code1 普通bfs code2 一次操作一层 package class036;import java.util.ArrayList; import java…

9. 使用Pthreads实现线程池(一)

背景 多线程的一个典型应用场景就是服务器的并发处理,如下图所示,多名用户向服务器发出数据操作的请求。为了提高并发性,我们可以在每收到一个用户请求时就创建一个线程处理相关操作。这种操作在请求数量较少时没有什么问题,但在请求数量很多时你会发现线程的创建和销毁所占…

绑定域名简单教程

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 &#x1f324;️安装Nginx环境 &…