当前位置: 首页 > 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;…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...