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

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

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

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

Device Mapper 机制

Device Mapper 机制详解 Device Mapper&#xff08;简称 DM&#xff09;是 Linux 内核中的一套通用块设备映射框架&#xff0c;为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程&#xff0c;并配以详细的…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...