当前位置: 首页 > news >正文

操作系统:06 进程通信

1 基本概念

        进程间通信是指两个或多个进程之间交互数据的过程,因为进程之间是相互独立的,为了协同工作必须进行进程间交互数据

2 进程间通信的分类

2.1 简单的进程间通信:

        信号(携带附加数据)、文件、命令行参数、环境变量表

2.2 传统的进程间通信:

        管道文件(有名管道、匿名管道)

2.3 XSI的进程间通信:

        共享内存、消息队列、信号量

2.4 网络的进程间通信:

        套接字技术Socket

3 传统的进程间通信:管道文件

        管道是UNIX系统中最古老的进程间通信方式,古老意味着所有系统都支持,早期的管道文件支持半双工通信,现在有些系统的管道支持全双工

        管道是一种特殊的文件,它的数据在文件中是流动的,读取之后就消失,如果文件中没有数据可读取时读取操作会阻塞

3.1 有名管道

        基于有文件名的管道文件的通信

3.1.1通信编程模型:

        进程A                   进程B

      创建管道文件           ...

      打开文件             打开文件

      写数据                  读数据

      关闭管道             关闭管道

      删除管道文件           ...

3.1.2创建有名管道:

命令: mkfifo filename

函数:

    int mkfifo(const char *pathname, mode_t mode);

        功能:创建有名管道文件

        pathname:管道文件的路径

        mode:文件权限

  3.2匿名管道:

        注意:只适合通过fork创建的父子进程之间通信

    int pipe(int pipefd[2]);

        功能:创建一个匿名管道文件

        通过参数pipefd,返回该匿名管道文件的读文件描述符和写文件描述符

        pipefd:存储读写fd的数组,输出型参数

        pipefd[0] 用于读  pipefd[1] 用于写

3.2.1 匿名管道的编程模型:

            父进程                     子进程

   创建获取匿名管道         ...

        创建子进程              共享一对fd

           关闭读                     关闭写

           写数据                     读数据

           关闭写                      关闭读

3.2.2 XSI进程间通信:

        X/open公司制定用于进程间通信的系统(S)接口(I)规范

        XSI进程间通信都需要借助系统内核完成,需要创建内核对象来进行操作,内核对象以整数形式提供给调用者使用,类似于文件描述符\文件指针作为标识符存在,也叫做IPC标识符

        文件描述符\文件指针需要借助唯一的文件名进行建立,IPC标识符的创建需要借助IPC键值(整数),如果想要创建不同的IPC标识符,需要一个独一无二的IPC键值(别人也没用过)

    key_t ftok(const char *pathname, int proj_id);

    功能:计算出一个IPC键值

    pathname:项目路径

    proj_id:项目编号

    返回值:根据路径+编号计算出一个IPC键值

    注意:项目路径必须是有效路径,否则如果为非法路径,无论两个参数是否相同,计算出来的IPC键值一定相同,那就没意义了

    如果是有效路径,只要两个参数出现一个不同,那么就会计算出不相同的IPC键值,就有意义了

4 共享内存

4.1 基本特点

        两个或多个进程之间共享一块由内核负责维护的内存,该段内存可以与多个不同的进程的虚拟内存建立映射

        优点:操作简单,不需要读写磁盘、不需要复制,最快的一种XSI机制

        缺点:需要考虑同步访问的问题,一般使用信号解决

4.2 使用

    int shmget(key_t key, size_t size, int shmflg);

    功能:创建/获取共享内存

    key:IPC键值 ftok给

    size:共享内存的大小,只有获取共享内存时此参数无意义就设置为0

    shmflg:

        IPC_CREAT 创建共享内存,已存在时则获取

        IPC_EXCL  共享内存已存在时则返回失败

        如果是获取直接赋0

        注意:当创建共享内存时,需要额外提供该段共享内存的权限码,

            例如shmget(xx,4096,IPC_CREAT|0644)

    返回值:IPC标识符,是创建/获取得到的共享内存的标识,错误会返回-1(只要不是-1就代表创建/获取成功)

    void *shmat(int shmid, const void *shmaddr, int shmflg);

    shmid:IPC标识符

    shmaddr:想要映射的虚拟内存首地址,如果为NULL时由操作系统自动选择

    shmfig:

        SHM_RND 当shmaddr不为NULL时才有效,标识从shmaddr开始取内存页的整数倍进行映射,提高内存读写效率

        SHM_RDONLY  以只读方式映射共享内存

    返回值:成功映射后的内存首地址,映射失败返回0xFFFFFFFF(-1)

    int shmctl(int shmid, int cmd, struct shmid_ds *buf);

    功能:删除/控制共享内存

    shmid:IPC标识符

    cmd:

        IPC_STAT    获取共享内存的属性数据  buf输出型参数(获取到的属性数据存储到buf里)

        IPC_SET     设置共享内存的属性数据  buf输入性参数(使用者将要设置的属性数据存到buf里)

        IPC_RMID    删除共享内存(IPC也会删掉,统统删光)

    struct shmid_ds {

        struct ipc_perm shm_perm;    //所有者相关信息

        size_t          shm_segsz;   //共享内存字节数

        time_t          shm_atime;   //最后映射时间

        time_t          shm_dtime;   //最后取消映射时间

        time_t          shm_ctime;   //最后修改时间

        pid_t           shm_cpid;    //创建者进程号PID

        pid_t           shm_lpid;    //最后取消映射的进程号PID

        shmatt_t        shm_nattch;  //当前映射次数

    };

    int shmdt(const void *shmaddr);

    功能:取消虚拟内存与共享内存的映射

    shmaddr:虚拟内存的首地址

4.3 编程模型

            进程A                                    进程B

         创建共享内存                     获取共享内存

         映射共享内存                     映射共享内存

         写数据并通知其它进程     接到通知后读数据

         接到通知后读数据         写数据并通知其它进程

         取消映射                               取消映射

         删除共享内存                             ...  

5 消息队列

5.1 基础概念

        由内核负责维护管理的数据链表结构,通过消息类型来对应的收发数据

5.2 使用

    int msgget(key_t key, int msgflg);

    功能:创建/获取消息队列

    key:IPC键值 ftok给

    shmflg:

        IPC_CREAT 创建消息队列,已存在时则获取

        IPC_EXCL  消息队列已存在时则返回失败

        如果是获取直接赋0

        注意:当创建消息队列时,需要额外提供该消息队列的权限码,

    返回值:IPC标识符,是创建/获取得到的共享内存的标识,错误会返回-1(只要不是-1就代表创建/获取成功)

    int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);

    功能:向消息队列发送消息包

    msqid:IPC标识符

    msgp:消息包结构首地址

            struct msgbuf {

               long mtype;       //消息类型,必须>0

               char mtext[n];    //消息数据

           };

    msgsz:消息数据的字节数即mtext的字节数

    msgflg:

        0   阻塞发送

        IPC_NOWAIT  当消息队列满时,立即结束并返回,

    ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg);

    功能:从消息队列中接收对应的消息包中的数据

    msqid:IPC标识符

    msgp:存储读取到的消息包结构首地址

        struct msgbuf {

            long mtype;       //消息类型,必须>0

            char mtext[n];    //消息数据

        };

    msgsz:消息包结构体字节数

    msgtyp:要接收的消息类型几号

        0   读取当前消息队列中的第一条消息包  

        >0  读取消息类型为msgtyp的消息包

        <0  读取消息类型<abs(msgtyp)的消息包,若有多个,则读取消息类型最小值的消息包

    msgflg:一般写0

        IPC_NOWAIT如果没有符合的消息包,则立即返回不阻塞    

        MSG_EXCEPT 如果msgtyp>0,则读取第一个值不等于msgtyp的消息包

        MSG_NOERROR 如果不包含此标志,实际消息包的字节数>msgtyp时会返回错误并不读取,如果包含,则不报错并只读取前msgtyp个字节

    int msgctl(int msqid, int cmd, struct msqid_ds *buf);

    功能:删除\控制消息队列

    shmid:IPC标识符

    cmd:

        IPC_STAT    获取消息队列的属性数据 buf输出型参数

        IPC_SET     设置消息队列的属性数据 buf输入型参数

        IPC_RMID    删除消息队列          buf无意义NULL

    buf:

        消息队列属性结构体

5.3 编程模型

       进程A                               进程B

    创建消息队列                 获取消息队列

      发送消息                         接收消息

    接收不同的消息包       发送不同的消息包

      删除消息                              ...

6 信号量

6.1基本特点

        由内核来维护共存给若干个进程的“全局变量”,用于记录共享资源的数量,限制进程对共享资源的访问

        信号量是一种数据操作锁,本身不具备完整的数据通信交换功能而是通过控制其他的通信资源来更好地实现进程间通信

    1、如果信号量的值>0,说明可以使用资源,需要先信号量-1.然后再使用

    2、如果信号量的值=0,说明没有资源可以使用,此时进程进入休眠,直到信号量的值>0,进程会被唤醒,执行步骤1

    3、当资源使用完毕后,先把信号量的值+1,然后内核会唤醒正在休眠的进程

    int semget(key_t key,int nsems,int semflg)

    功能:创建/获取信号量

    key:IPC键值

    nsems:信号量整体个数,一般写1

    semflg:

    返回值:IPC标识符

    int semop(int semid,struct sembuf *sops,size_t nsops);

    功能:对信号量的值进行操作

    semid:标识符

相关文章:

操作系统:06 进程通信

1 基本概念 进程间通信是指两个或多个进程之间交互数据的过程&#xff0c;因为进程之间是相互独立的&#xff0c;为了协同工作必须进行进程间交互数据 2 进程间通信的分类 2.1 简单的进程间通信&#xff1a; 信号(携带附加数据)、文件、命令行参数、环境变量表 2.2 传统的进…...

WRF模式

随着生态文明建设和“碳中和”战略的持续推进&#xff0c;我国及全球气候变化及应对是政府、科学界及商业界关注的焦点。气候是多个领域&#xff08;生态、水资源、风资源及碳中和等问题&#xff09;的主要驱动因素&#xff0c;合理认知气候变化有利于解释生态环境变化机理及过…...

2直接连接的网络与VLAN划分【实验】【计算机网络】

2直接连接的网络与VLAN划分【实验】【计算机网络】 前言推荐2直接连接的网络与VLAN划分2.1共享式以太网和交换式以太网实验目的实验内容及实验环境实验原理共享式以太网交换式以太网 实验过程搭建实验环境初始化序训练操作共享式以太网-操作交换式以太网查看共享式以太网冲突查…...

【Linux0.11代码分析】04 之 head.s 启动流程

【Linux0.11代码分析】04 之 head.s 启动流程 一、boot/head.s 系列文章如下&#xff1a; 系列文章汇总&#xff1a;《【Linux0.11代码分析】之 系列文章链接汇总&#xff08;全&#xff09;》 . 1.《【Linux0.11代码分析】01 之 代码目录分析》 2.《【Linux0.11代码分析】02 之…...

自动化测试和selenium的使用

目录 自动化测试定义 为什么选择selenium来作为我们web自动化测试的工具&#xff1f; 自动化测试定位元素 使用cssSelector定位 使用XPath 定位 操作测试对象 模拟手动从键盘输入 点击对象 获取页面文本 清除对象输入的文本内容 添加等待&#xff08;三种方式&#…...

Ubuntu常用终端操作

终端快捷键 打开 Ctrlaltt:打开终端&#xff08;默认路径为家目录&#xff09; Ctrlshiftn&#xff1a;打开终端&#xff08;与当前终端处于同一路径下&#xff09; Ctrlshiftt:打开终端&#xff08;在大终端下面创建小终端&#xff09; alt数字 关闭 exitCtrld 窗口切换 …...

Spring Security 6.x 系列【34】认证篇之前后端分离场景下的集成方案

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 文章目录 1. 前言2. 案例演示2.1 未认证2.2 认证成功2.3 认证失败2.4 权限不足2.5 注…...

Qt之QTextToSpeech 让你的应用程序说话

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言QTextToSpeech基础使用1.创建一个QTextToSpeech对象2.朗读文字3.朗读文件和状态信息4.设置QTTS(QTextToSpeech)属性5.输出支持区域的设置列表、语言6.实现小数点朗读QTextToSpeech项目(练习)…...

为什么程序员喜欢用Linux?

Linux哪些行业在运用&#xff1f; Linux系统运用极其广泛&#xff0c;不少用户只知道windows&#xff0c;是因为&#xff0c;Linux的运用主要是在企业端。现在科技极其发达&#xff0c;我们手机在手&#xff0c;就能干很多事情&#xff0c;只需点一点屏幕&#xff0c;轻松完成…...

leetcode 598. 范围求和 II

题目描述解题思路执行结果 leetcode 598. 范围求和 II 题目描述 范围求和 II 给你一个 m x n 的矩阵 M &#xff0c;初始化时所有的 0 和一个操作数组 op &#xff0c;其中 ops[i] [ai, bi] 意味着当所有的 0 < x < ai 和 0 < y < bi 时&#xff0c; M[x][y] 应该…...

javaweb前置知识

1.CSS CSS的角色&#xff1a;页面显示的美观风格CSS的基础语法&#xff1a;标签样式&#xff1b;类样式&#xff1b;ID样式&#xff1b;组合样式&#xff1b;嵌入式样式表&#xff1b;内部样式表&#xff1b;外部样式表盒子模型&#xff1a;border、margin、padding定位和浮动…...

基于微信小程序的酒店预定管理系统设计与实现

第1章 绪论 1 1.1开发背景与意义 1 1.2开发方法 1 1.3论文结构 1 2系统开发技术与环境 3 2.1 系统开发语言 3 2.2 系统开发工具 3 2.3 系统页面技术 3 2.4 系统数据库的选择 4 2.5 系统的运行环境 4 2.5.1 硬件环境 4 2.5.2 软件环境 4 3系统分析 5 3.1可行性分析 5 3.1.1 经济…...

26. Service——深入学习

本章讲解知识点 Service 会话保持机制Service 的多端口设置Service 支持的网络协议Kubernetes 的服务发现机制Headless ServiceEndpoint Slices这一节我们来讲讲 Service 更多细节 1. Service 会话保持机制 Service 支持通过设置 sessionAffinity 实现基于客户端 IP 的会话保…...

【算法】Check If Word Is Valid After Substitutions 检查替换后的词是否有效

文章目录 Check If Word Is Valid After Substitutions 检查替换后的词是否有效问题描述&#xff1a;分析代码 Tag Check If Word Is Valid After Substitutions 检查替换后的词是否有效 问题描述&#xff1a; 给你一个字符串 s &#xff0c;请你判断它是否 有效 。 字符串 s…...

基于jenkinsfile布置java工程

需求 通过jenkins发布java项目到服务器 预备环境 项目地址&#xff1a; https://gitee.com/asaland/sb-docker-appJenkins 2.387.3 通过Jenkinsfile实现方式 jenkins ui 配置pipeline 什么是pipeline? 直接看注释吧&#xff0c;简单点就是编排可以多个跨时间的构建代理…...

Spring JpaTransactionManager事务管理

首先&#xff0c;在做关于JpaTransactionManager之前&#xff0c;先对Jpa做一个简单的了解&#xff0c;他毕竟不如hibernate那么热门&#xff0c;其实二者很相识&#xff0c;只不过后期hibernate和JDO 版本都已经兼容了其Jpa&#xff0c;目前大家用的少了。 JPA全称Java Persi…...

全国职业院校技能大赛网络建设与运维赛项赛题(七)

全国职业院校技能大赛 网络建设与运维 赛题 (七)...

asp.net+sqlserver企业公司进销存管理系统

基于WEB的进销存管理系统主要企业内部提供服务&#xff0c;系统分为管理员&#xff0c;和员工2部分。 在本基于WEB的进销存管理系统中分为管理员&#xff0c;和普通用户2中模式&#xff0c;其中管理人员主要是对企业内商品类型。商品信息商品的出入库信息&#xff0c;以及员工…...

WxGL应用实例:绘制点云

WxGL附带了几个工具函数&#xff0c;其中read_pcfile用来解析.ply和.pcd格式的点云文件&#xff0c;该函数返回一个PointCloudData类实例&#xff0c;包含以下属性&#xff1a; PointCloudData.ok - 数据是否可用&#xff0c;布尔型PointCloudData.info - 数据可用性说明&…...

一个月内面了30家公司,薪资从18K变成28K,真行啊····

工作3年&#xff0c;换了好几份工作&#xff08;行业流行性大&#xff09;&#xff0c;每次工作都是裸辞。朋友都觉得不可思议。因为我一直对自己很有信心&#xff0c;而且特别不喜欢请假面试&#xff0c;对自己负责也对公司负责。 但是这次没想到市场环境非常不好&#xff0c;…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

汽车生产虚拟实训中的技能提升与生产优化​

在制造业蓬勃发展的大背景下&#xff0c;虚拟教学实训宛如一颗璀璨的新星&#xff0c;正发挥着不可或缺且日益凸显的关键作用&#xff0c;源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例&#xff0c;汽车生产线上各类…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题

分区配置 (ptab.json) img 属性介绍&#xff1a; img 属性指定分区存放的 image 名称&#xff0c;指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件&#xff0c;则以 proj_name:binary_name 格式指定文件名&#xff0c; proj_name 为工程 名&…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...