嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第五天-Linux消息共享内存练习题(物联技术666)

  更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。

物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机领域.https://blog.csdn.net/weixin_39804904?type=blog

Linux进程间通信-System V IPC

概述

Linux/Unix中有三种System V IPC可以用以进程间通信,分别是消息队列、信号量以及共享内存。IPC资源表示单独的消息队列、共享内存或信号量集合。这三种资源均对应有XXXget()及XXXctl()函数(XXX代表msg、sem、shm三者之一)。下面我们就一一介绍。

IPC对象的共有特性

首先明确一个概念,所谓IPC对象是表示一个单独的消息队列、一个分配好的共享内存或者是一个包含一个或多个信号量的信号量集合。这些对象的共有特性如下:

均有XXXget()函数(XXX代表msg、sem、shm三者之一),且有两个共同参数key和flag。详见后面对具体IPC对象的介绍;

均有XXXctl()函数,且均提供IPC_SET、IPC_STAT、IPC_RMID命令,前两者用来设置或得到IPC对象的状态信息,IPC_RMID用来释放IPC对象资源;

共同的操作模式,都是先通过XXXget()创建一个IPC资源,返回值是该IPC资源的ID。在以后的操作中,均以IPC资源的ID为参数,以对相应的IPC资源进行操作。其他进程可以通过XXXget()取得已有的IPC资源的ID(前提是权限允许)并对其进行操作,从而使进程间通信成为可能;

共同的数据结构,每一类IPC资源都有一个ipc_ids结构的全局变量用来描述同一类资源的公有数据,详见下一小节;

IPC数据结构

在1.1节我们谈到每一类IPC资源都有一个ipc_ids结构的全局变量用来描述同一类资源的公用数据,三种IPC对象对应的三个全局变量分别是semid_ds,msgid_ds和shmid_ds。ipc_ids结构定义如下:

struct ipc_ids{

     int       size;                            /* entries数组的大小 */

     int       in_use;                       /* entries数组已使用的元素个数

     int       max_id;

     unsigned short                   seq;

     unsigned short                   seq_max;

struct semaphore            sem;  /* 控制ipc_ids结构访问 */

spinlock_t               ary;      /* 自旋控制对数组entries访问 */

struct ipc_id*                    entries;

};

struct ipc_id{

     struct kern_ipc_perm *p;

};

数组entries的每一项指向一个kern_ipc_perm结构,kern_ipc_perm结构表示每一个IPC资源的属性,用来控制操作权限。

struct kern_ipc_perm{

  key_t     key; /* 用户提供的键,由XXXget函数使用 */

  uid_t     uid; /* 创建者用户ID */

  gid_t     gid; /* 创建者组ID */

  uid_t     cuid; /* 所有者用户ID */

  gid_t     cgid; /* 所有者组ID */

  mode_t    mode; /* 操作权限,包括读、写等 */

  unsigned long seq;

};

因为每个IPC资源描述符的第一个成员就是kern_ipc_perm结构。因此,我们可以认为数组entries的每一非空项均指向一个IPC资源。

IPC资源ID与entries数组下标的联系

当创建一个IPC资源时

调用函数ipc_addid从相应ipc_ids结构的entries数组中找出第一个未使用的项,然后返回其下标index

返回IPC资源。IPC资源ID=SEQ_MULTIPLIER*seq+index
SEQ_MULTIPLIER是可用资源的最大数目,seq是ipc_ids结构中的seq。每当分配一个IPC资源时,ipc_ids结构中的seq就增1。

当知道IPC资源ID时,可通过IPC资源ID%SEQ_MULTIPLIER得到其在entries数组中的index,从而找到相应的IPC资源。

why保证在一段时间内IPC资源ID的惟一性。

IPC标识符和IPC键值

每个IPC结构在内核中都是通过一个非负整数的标识符来惟一标识,这个标识符是IPC对象对内核可见(即内核维护IPC对象时使用)的内部名。但对于IPC对象而言,其最大的作用是用以进程间通信,那么多个进程如何能够实现对同一IPC对象的操作呢?为了达到这个目的,便需要一个标识符用来让用户态的应用进程可以访问同一个IPC对象,这个标识符叫做IPC对象的外部名,也即我们这里所说的IPC对象的键值key,每个IPC对象都与一个key相关联,于是不同进程便可以通过引用相同的key来操作同一个IPC对象。只要创建一个IPC对象,就必须指定一个key,key的数据类型是基本系统数据类型key_t,在Linux2.6.9内核版本中被定义为int类型。一个作为IPC对象外部标识的key被内核转换成内部标识。

ftok()函数

一个IPC对象的key值,可以明确指定为IPC_PRIVATE,但更通常的做法是根据一个路径名和一个项目ID作为传入参数,调用ftok()函数由系统转换为一个key,然后在创建IPC对象时使用此key。

ftok()函数原型如下:

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

使用这个函数需要包含<sys/types.h>和<sys/ipc.h>两个头文件。这个函数接受两个输入参数pathname和proj_id,分别解释如下。

一个路径名,此路径名必须引用一个实际存在的文件或目录;

项目id,一个整数值,函数只使用此参数的低8位

ftok()函数通过以下方式创建一个key:按指定的路径名取得其stat结构,从该结构中取出部分st_dev和st_ino字段,然后再于proj_id的低8位结合起来。如果两个路径名引用两个不同的文件,那么,对这两个路径名ftok通常返回不同的key。但是,因为i节点号和key通常都存放在长整型中,于是,ftok创建key时可能会丢失信息,这意味着,如果使用同一proj_id,那么对于不同的两个pathname,有可能产生相同的key(这种情况我还没有遇到过,呵呵……哪位朋友遇到了可以告知一声)。绝大多数情况下,我们要指定不同的路径名,至于proj_id,我一直都是设置为0,不知道这样有什么不好,但确实尚未发现问题。

semget/shmget/msgget函数

由ftok函数得到一个key后,便可以调用msgget

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

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

相关文章

Qt优秀开源项目之二十:RedPanda-CPP(小熊猫C++)

小熊猫C是跨平台、轻量易用的开源C/C集成开发环境。 官网&#xff1a;http://royqh.net/redpandacpp github&#xff1a;https://github.com/royqh1979/RedPanda-CPP 小熊猫C&#xff08;原名小熊猫Dev-C 7)是基于Qt开发的Dev-C替代版本。和经典的Dev-C 5.11、新的Embarcadero …

海外跨境独立站和代购系统存在必然联系?独立站建站初期,以及如何运营好独立站。

海外跨境独立站和代购系统在多个方面存在差异&#xff1a; 定位&#xff1a;独立站是拥有独立域名&#xff0c;自主宣传推广媒体与渠道的新型网站&#xff0c;更侧重于培养买家&#xff0c;做品牌建设&#xff0c;相当于个体经营专卖店。而代购系统是利用先进的技术和流程管理…

HTML---JavaScript操作DOM对象

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 本章目标 了解DOM的分类和节点间的关系熟练使用JavaScript操作DOM节点 访问DOM节点 能够熟练的进行节点的创建、添加、删除、替换等 能够熟练的设置元素的样式 能够灵活运用JavaScript获取元素…

【北邮国院大四上】Business Technology Strategy 企业技术战略

北邮国院电商大四在读&#xff0c;本笔记仅为PPT内容的整理与翻译&#xff0c;并不代表本课程的考纲及重点&#xff0c;仅为本人复习时方便阅读与思考之作。 写在前面 大家好&#xff0c;欢迎来到大学期间的最后一门课程&#xff0c;本门课程是中方课&#xff0c;所以很庆幸的…

Python综合数据分析_根据订单求RFM值

文章目录 0.导入数据1.数据可视化2.数据清洗3.特征工程4.构建User用户表5.求R值6.求F值7.求M值 0.导入数据 import pandas as pd #导入Pandas df_sales pd.read_csv(订单.csv) #载入数据 df_sales.head() #显示头几行数据 1.数据可视化 import matplotlib.pyplot as plt #导…

django学习:ORM实现数据库的连接、表的创建与增删改查

1.ORM机制 Django 是一个流行的 Python Web 框架&#xff0c;它提供了一个强大的 ORM&#xff08;对象关系映射&#xff09;机制&#xff0c;用于管理应用程序和数据库之间的数据交互。 ORM 是一种编程技术&#xff0c;它将数据库表的结构和数据转换为面向对象的模型&#xff…

Elasticsearch:Serarch tutorial - 使用 Python 进行搜索 (一)

本实践教程将教你如何使用 Elasticsearch 构建完整的搜索解决方案。 在本教程中你将学习&#xff1a; 如何对数据集执行全文关键字搜索&#xff08;可选使用过滤器&#xff09;如何使用机器学习模型生成、存储和搜索密集向量嵌入如何使用 ELSER 模型生成和搜索稀疏向量如何使用…

如何编写高效的正则表达式?

正则表达式&#xff08;Regular Expression&#xff0c;简称regex&#xff09;是一种强大的文本处理技术&#xff0c;广泛应用于各种编程语言和工具中。本文将从多个方面介绍正则表达式的原理、应用和实践&#xff0c;帮助你掌握这一关键技术。 正则可视化 | 一个覆盖广泛主题…

使用 React 和 MUI 创建多选 Checkbox 树组件

在本篇博客中&#xff0c;我们将使用 React 和 MUI&#xff08;Material-UI&#xff09;库来创建一个多选 Checkbox 树组件。该组件可以用于展示树形结构的数据&#xff0c;并允许用户选择多个节点。 前提 在开始之前&#xff0c;确保你已经安装了以下依赖&#xff1a; Reac…

关于目标检测中按照比例将数据集随机划分成训练集和测试集

1. 前言 在做目标检测任务的时候&#xff0c;不少网上的数据&#xff0c;没有划分数据集&#xff0c;只是将数据和标签放在不同的文件夹下&#xff0c;没有划分数据集 虽然代码简单&#xff0c;每次重新编写还是颇为麻烦&#xff0c;这里记录一下 如下&#xff0c;有的数据集…

Kubernetes复习总结(二):Kubernetes容器网络

2、Kubernetes容器网络 1&#xff09;、Docker网络原理 Docker默认使用的网络模型是bridge&#xff0c;这里只讲bridge网络模型 1&#xff09;容器之间通信原理 当安装完docker之后&#xff0c;docker会在宿主机上创建一个名叫docker0的网桥&#xff0c;默认IP是172.17.0.1…

vite + vue3引入ant design vue 报错

npm install ant-design-vue --save下载插件并在main.ts 全局引入 报错 解决办法一&#xff1a; main.ts注释掉全局引入 模块按需引入 解决办法二 将package.json中的ant-design-vue的版本^4.0.0-rc.4改为 ^3.2.15版本 同时将将package-lock.json中的ant-design-vue的版本…

最靠谱的Arduino IDE集成ESP32环境

设置的 地址为&#xff1a; https://dl.espressif.com/dl/package_esp32_index.json

PIG框架学习2——资源服务器的配置详解

一、前言 1、pig资源服务器的配置 Spring Security oauth2相关的依赖是在pigx-common-security模块中引入的&#xff0c;其他模块需要进行token鉴权的&#xff0c;需要在微服务中引入pigx-common-security模块的依赖&#xff0c;从而间接引入相关的Spring security oauth2依赖…

一、二进制方式 安装部署K8S

目录 一、操作系统初始化 1、关闭防火墙 2、关闭 SELinu 3、 关闭 swap 4、添加hosts 5、同步系统时间 二、集群搭建 —— 使用外部Etcd集群 1、自签证书 2、自签 Etcd SSL 证书 ① 创建 CA 配置文件&#xff1a;ca-config.json ② 创建 CA 证书签名请求文件&#xff…

爬虫实战3-js逆向入门:以黑猫投诉平台为例

目录 引言 逆向过程 步骤一&#xff1a;找到参数对应js代码位置 步骤二&#xff1a;分析参数值的生成逻辑 步骤三&#xff1a;确定函数u的具体内容 步骤四&#xff1a;使用python实现请求参数的生成 投诉信息爬取 引言 下面是一张主流网页加密方法的思维导图&#xff0…

[SpringBoot]自定义注解@AutoFill,实现公共字段自动填充(避免重复对时间属性初始化

对于时间属性&#xff0c;如createTime、updateTime在进行插入、修改操作时都要一个个初始化处理&#xff0c;过于麻烦。 可以自定义注解AutoFill作用于INSERT&#xff0c;UPDATE操作方法上&#xff0c;再自定义切面类&#xff0c;统一拦截加入了AutoFill注解的方法&#xff0c…

Python爬虫获取百度的图片

一. 爬虫的方式&#xff1a; 主要有2种方式: ①ScrapyXpath (API 静态 爬取-直接post get) ②seleniumXpath (点击 动态 爬取-模拟) ScrapyXpath XPath 是 Scrapy 中常用的一种解析器&#xff0c;可以帮助爬虫定位和提取 HTML 或 XML 文档中的数据。 Scrapy 中使用 …

ctfshow——信息搜集

文章目录 web 1web 2web 3web 4web 5web 6web 7web 8web 9web 10web 11web 12web 13web 14web 15web 16web 17web 18web 19web 20 web 1 题目提示开发注释未及时删除。 直接右键查看源代码。 web 2 在这关我们会发现&#xff1a;1&#xff09;无法使用右键查看源代码&…

【亚马逊云科技】自家的AI助手 - Amazon Q

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…