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

news2024/9/23 11:22:19

  更多配套资料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.coloradmin.cn/o/1365283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024--Django平台开发-Web框架和Django基础(二)---Mysql多版本共存(Mac系统)

MySQL多版本共存&#xff08;Mac系统&#xff09; 想要在Mac系统上同时安装【MySQL5.7 】【MySQL8.0】版本&#xff0c;需要进行如下的操作和配置。 想要同时安装两个版本可以采取如下方案&#xff1a; 方案1&#xff1a;【讲解】 MySQL57&#xff0c;用安装包进行安装。 MyS…

像专家一样使用TypeScript映射类型

掌握TypeScript的映射类型&#xff0c;了解TypeScript内置的实用类型是如何工作的。 您是否使用过Partial、Required、Readonly和Pick实用程序类型? 你知道他们内部是怎么运作的吗? 如果您想彻底掌握它们并创建自己的实用程序类型&#xff0c;那么不要错过本文所涵盖的内容。…

2、Excel:基础概念、表格结构与常见函数

数据来源&#xff1a;八月成交数据 数据初探 业务背景 数据来源行业&#xff1a;金融行业&#xff08;根据应收利息和逾期金额字段来判断&#xff09; 可以猜测&#xff1a; 业务主体&#xff1a;某互联网金融公司&#xff08;类似支付宝&#xff09;也业务模式&#xff1a;给…

leetcode动态规划问题总结 Python

目录 一、基础理论 二、例题 1. 青蛙跳台阶 2. 解密数字 3. 最长不含重复字符的子字符串 4. 连续子数组的最大和 5. 最长递增子序列 6. 最长回文字符串 7. 机器人路径条数 8. 礼物的最大价值 一、基础理论 动态规划其实是一种空间换时间的基于历史数据的递推算法&…

Java异常机制:从混乱到控制的错误管理艺术

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、异常的体系结构1、异常的体系结构2、异常的分类 二、异常的处理1、异常的抛出2、异常的捕获2.1、异常声明throws2.2、try-c…

C#中List<T>底层原理剖析

C#中List底层原理剖析 1. 基础用法2. List的Capacity与Count&#xff1a;3.List的底层原理3.1. 构造3.2 Add()接口3.3 Remove()接口3.4 Inster()接口3.5 Clear()接口3.6 Contains()接口3.7 ToArray()接口3.8 Find()接口3.8 Sort()接口 4. 总结5. 参考 1. 基础用法 list.Max() …

2024龙年艺术字矢量Ai设计文件60套

2024新年将至&#xff0c;设计师们早已开始为龙年海报、推文的制作摩拳擦掌。该合集不仅内容丰富多样,作为矢量文件资源&#xff0c;也能够让设计者更为轻松地编辑与创作。 合集内另附200多张电脑壁纸。 文件总大小368MB 链接&#xff1a;https://pan.quark.cn/s/0caab4cf065…

Google Earth Engine谷歌地球引擎GEE批量计算一年中每个指定天数范围内遥感影像平均值的方法

本文介绍在谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;中&#xff0c;计算长时间序列遥感影像数据在多年中&#xff0c;在每一个指定天数的时间范围内的平均值的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#x…

MySQL BufferPool精讲

缓存的重要性 我们知道&#xff0c;对于使用InnoDB作为存储引擎的表来说&#xff0c;不管是用于存储用户数据的索引&#xff08;包括聚簇索引和二级索引&#xff09;&#xff0c;还是各种系统数据&#xff0c;都是以页的形式存放在表空间中的&#xff0c;而所谓的表空间只不过…

杰发科技AC7840——CAN通信简介(2)

1.时钟频率 2.位时间 3.采样点 4.消息缓冲区 和ST、NXP的邮箱类似&#xff0c;AutoChips用了缓冲区的概念。 5.接收缓冲区 屏蔽掉demo程序的发送&#xff0c;只看接收情况 在回调中接收数据 先判断是不是进了接收中断 接收数据的处理函数 所有buff数据放到Info buff的内容 BUF…

环境中碳循环

含碳的物质有CO2、CO、CH4、糖类、脂肪和蛋白质等&#xff0c;碳循环以CO2为中心&#xff0c;CO2被植物、藻类利用进行光合作用&#xff0c;合成植物性碳&#xff1b;动物摄食植物就将植物性碳转化为动物性碳&#xff1b;动物和人呼吸放出CO2&#xff0c;有机碳化合物被厌氧微生…

AArch64 memory management学习(一)

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网参考文档为准。AArch64 memory management学习一共分为两章&#xff0c;这是第一…

Github 2024-01-08开源项目周报 Top14

根据Github Trendings的统计&#xff0c;本周(2024-01-08统计)共有14个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目5TypeScript项目3C项目2Dart项目1QML项目1Go项目1Shell项目1Rust项目1JavaScript项目1C#项目1 免费…

【网络安全】PKI加密

1、PKI概述 名称&#xff1a;Public Key Infrastruction 公钥基础设施 作用&#xff1a;通过加密技术和数字签名保证信息的安全 组成&#xff1a;公钥机密技术、数字证书、CA、RA 2、信息安全三要素 机密性 完整性 身份验证/操作的不可否认性 3、哪些IT领域用到PKI&…

【Golang】go编程语言适合哪些项目开发?

文章目录 **前言****Go 编程语言适合哪些项目开发&#xff1f;****1. 网络编程项目&#xff1a;****2. 大数据处理项目&#xff1a;****3. 云计算项目&#xff1a;****4. Web开发项目&#xff1a;****5. 嵌入式系统项目&#xff1a;****6.API开发**:**1. 并发性能&#xff1a;*…

数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换

导读 数据库的查询优化器是整个系统的"大脑"&#xff0c;一条SQL语句执行是否高效在不同的优化决策下可能会产生几个数量级的性能差异&#xff0c;因此优化器也是数据库系统中最为核心的组件和竞争力之一。阿里云瑶池旗下的云原生数据库PolarDB MySQL版作为领先的云…

prometheus 黑盒监控

黑盒监控 “白盒监控” 是需要把对应的Exporter程序安装到被监控的目标主机上&#xff0c;从而实现对主机各种资源以及状态的数据采集工作 ”黑盒监控“ 是不需要把Exporter程序部署到被监控的目标主机上&#xff0c;比如全球的网络质量的稳定性&#xff0c;通常用ping操作&am…

在 Mac 上轻松安装和配置 JMeter

Apache JMeter 是一个开源的负载测试工具&#xff0c;可以用于测试静态和动态资源&#xff0c;确定服务器的性能和稳定性。在本文中&#xff0c;我们将讨论如何下载和安装 JMeter。 安装 Java&#xff08;已安装 Java 的此步骤可跳过&#xff09; 要安装 Java&#xff0c;请按…

基于SSM的停车管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

1-03C语言超基础语法

一、概述 为了更好的进行后续的课程&#xff0c;避免出现"老师&#xff0c;我还没学过的东西&#xff0c;你怎么直接用&#xff1f;"诸如此类疑问&#xff0c;本小节就诞生了。 实际上&#xff0c;整个第一个大章节的所有小节都是"C语言基础语法"&#x…