嵌入式培训机构四个月实训课程笔记(完整版)-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.mzph.cn/news/604980.shtml

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

相关文章

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

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

电商API-获取拼多多商品详情数据精准价格API测试示例

pinduoduo.item_get_app_pro获取拼多多商品详情数据 如何获取apikey&#xff1f; 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff…

【Leetcode】移除后集合的最多元素数

目录 &#x1f4a1;题目描述 &#x1f4a1;思路 &#x1f4a1;总结 100150. 移除后集合的最多元素数 &#x1f4a1;题目描述 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;它们的长度都是偶数 n 。 你必须从 nums1 中移除 n / 2 个元素&#xff0c;同时从 …

Centos 配置 DNS 服务器

在连网的情况下&#xff0c;安装 DNS 服务器&#xff0c;使用命令&#xff1a; yum install bind 安装完成过后&#xff0c;关闭 DNS 服务器防火墙命令&#xff1a; systemctl stop firewalld 在 “ # ” 输入命令&#xff1a; gedit /etc/named.conf 进入过后将 listen…

Docker给容器添加新端口映射

Docker容器添加新端口映射 查看运行的容器 docker ps查看容器挂载目录 docker inspect [容器id]我这里是[容器name] 停止容器 docker stop pythonWarning: Stopping docker.service, but it can still be activated by: docker.socket 停止docker服务 systemctl stop dock…

网络安全—SSL安全访问应用

文章目录 网络拓扑部署CA服务器颁发证书开启Web服务安装IIS服务修改Web默认网页 申请Web证书前提准备申请文件生成申请web证书开始安装web证书 客户机访问web默认网站使用HTTP使用HTTPS 为客户机安装浏览器证书 环境&#xff1a;Windows Server 2003 网络拓扑 这里使用NAT还是…

x64dbg的基本使用

目录 x64dbg简介 术语 打开程序 x64dbg打开界面介绍 汇编窗口 内存窗口 寄存器窗口 堆栈窗口 基本调试方法 搜索字符串 退出程序 x64dbg简介 x64dbg是软件逆向里必不可少的动态调试工具&#xff0c;本来考虑学习一下OD&#xff0c;但是考虑到OD很久之前就已经停止维…

ArcGIS制图技巧总结

Part 1 制图综述 1.1 制图的目的 随着GIS在各行各业的深入应用&#xff0c;各信息化部门和生产单位都逐渐建立起自己的GIS的应用&#xff0c;同时积累了大量的地理数据。随着应用深度和广度的推进&#xff0c;针对数据建立专题应用越来越迫切&#xff0c;对行业专题制图的需…

2024拜年祝福视频AE模板31套

做短视频必备的AE模板非常好看&#xff0c;跨年做个视频非常漂亮&#xff0c;喜欢的赶紧保存吧&#xff01; 链接&#xff1a;https://pan.quark.cn/s/fc1f3db12049

XML技术分析03

一、XMLHttpRequest 对象 XMLHttpRequest 对象用于在后台与服务器交换数据。 创建 XMLHttpRequest 对象 所有现代浏览器 (IE7、Firefox、Chrome、Safari 以及 Opera) 都内建了 XMLHttpRequest 对象。 通过一行简单的 JavaScript 代码&#xff0c;我们就可以创建 XMLHttpReq…

09.简单工厂模式与工厂方法模式

道生一&#xff0c;一生二&#xff0c;二生三&#xff0c;三生万物。——《道德经》 最近小米新车亮相的消息可以说引起了不小的轰动&#xff0c;我们在感慨SU7充满土豪气息的保时捷设计的同时&#xff0c;也深深的被本土品牌的野心和干劲所鼓舞。 今天我们就接着这个背景&…

uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景&#xff1a;uniapp与Java实现的安卓端app支付宝支付&#xff0c;本想先在沙箱测试环境测支付&#xff0c;但一直提示“商家订单参数异常&#xff0c;请重新发起付款。”&#xff0c;接着报错信息就是&#xff1a;{ "errMsg": "requestPayment:fail [pa…

【书生大模型00--开源体系介绍】

书生大模型开源体系介绍 0 通用人工智能1 InternLM性能及模型2 从模型到应用 大模型成为目前很热的关键词&#xff0c;最热门的研究方向&#xff0c;热门的应用&#xff1b;ChatGPT的横空出世所引爆&#xff0c;快速被人们上手应用到各领域&#xff1b; 0 通用人工智能 相信使…

[蓝桥杯学习] 线段树

学习blibli 定义 线段树是一种特殊的平衡二叉查找树&#xff0c;使用线段树&#xff0c;可以实现数据的添加、查找和删除。 树的根结点表示了一个完整的单元区间&#xff0c;左右孩子的区间是将父结点的区间进行二分&#xff0c;左右孩子的区间之和&#xff0c;就是他们的根…

【机器学习】循环神经网络(四)-应用

五、应用-语音识别 5.1 语音识别问题 详述语音识别的经典方法GMMHMM框架 5.2 深度模型 详述DNN-HMM结构 循环神经网络与CTC技术结构用于语音识别问题 六、自然语言处理 RNN-LM建模方法 6.1 中文分词 6.2 词性标注 6.3 命名实体识别 详述LSTMCRF进行命名实体识别的方法 6.4 文本…

ElasticSearch 性能优化

提升写入性能 使用 bulk 接口批量写入 节省重复创建连接的网络开销通过进行基准测试来找到最佳的批处理数量 延长 refresh 的时间间隔 通过延长 refresh&#xff08;刷新&#xff09;的时间间隔可以降低段合并的频率&#xff0c;段合并十分耗费资源默认的刷新频率为1s&…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于两阶段随机优化的电能量与深度调峰融合市场出清模型及定价方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主的专栏栏目《论文与完整程序》 这个标题涉及到一个电力市场的建模和定价方法&#xff0c;采用了两阶段随机优化的策略&#xff0c;目标是实现电能量与深度调峰的融合。下面是对标题中各个…

百度搜索金融:构建高时效、高可用的分布式数据传输系统

作者 | 搜索技术平台研发部 导读 分布式数据传输系统是一种用于在多个计算节点之间高效传输大量数据的系统&#xff0c;诣在高效的解决大规模数据迁移、备份、跨地域复制等问题&#xff0c;其广泛应用在实时数据流传输、跨数据中心数据迁移、多媒体传输等场景&#xff0c;在大多…

智能合约:3分钟开发ERC20 token(2)

0.前言 上一节我们讲到了开发智能合约的准备工作&#xff0c;以及在线编程平台remix 智能合约&#xff08;1&#xff09; 这一节讲解如何开发、发行一个代币&#xff0c;并具备包括代币铸造mint&#xff0c;转账transfer和销毁burn功能&#xff0c;并确保合约拥有者owner的权限…

Tracert 与 Ping 程序设计与实现(2024)

1.题目描述 了解 Tracert 程序的实现原理&#xff0c;并调试通过。然后参考 Tracert 程序和计算机网络教材 4.4.2 节&#xff0c; 计算机网络 课程设计指导书 2 编写一个 Ping 程序&#xff0c;并能测试本局域网的所有机器是否在线&#xff0c;运行界面如下图所示的 QuickPing …