嵌入式linux的学习笔记-共享内存(六)

共享内存
共享内存是可以被多个进程共享访问的一部分物理内存,如果多个进程都把一个内存区映射到自身的虚拟地址空间,则这些进程就可以直接访问该共享的内存区域,从而通过共享内存的方式实现多进程间的通讯,共享内存是进程间数据通讯的最快方法.
共享内存的实现分为两步:
1,创建共享内存,使用shmget函数
2,映射共享内存,将创建的共享内存映射到具体的进程空间中去,使用shmat函数

int shmget(key_t key,int size,int shmflg); //用于创建一个共享内存
共享内存对象的创建或获得。与其它IPC机制一样,进程在使用共享内存区域以前,必须通过系统调用sys_ipc (call值为SHMGET)创建一个键值为key的共享内存对象,或获得已经存在的键值为key的某共享内存对象的引用标识符。以后对共享内存对象的访 问都通过该引用标识符进行。对共享内存对象的创建或获得由函数sys_shmget完成.这里key是表示该共享内存对象的键值,size是该共享内存区 域的大小(以字节为单位),shmflg是标志(对该共享内存对象的特殊要求)。
这里key是表示该共享内存对象的键值,size是该共享内存区域的大小(以字节为单位),shmflg是标志(对该共享内存对象的特殊要求)。

它所做的工作如下:
1) 如果key == IPC_PRIVATE,则总是会创建一个新的共享内存对象。
但是 (The name choice IPC_PRIVATE was perhaps unfortunate, IPC_NEW would more clearly show its function)
* 算出size要占用的页数,检查其合法性。
* 申请一块内存用于建立shmid_kernel数据结构,注意这里申请的内存区域大小不包括真正的共享内存区,实际上,要等到第一个进程试图访问它的时候才真正创建共享内存区。
* 根据该共享内存区所占用的页数,为其申请一块空间用于建立页表(每页4个字节),将页表清0。
* 搜索向量表shm_segs,为新创建的共享内存对象找一个空位置。
* 填写shmid_kernel数据结构,将其加入到向量表shm_segs中为其找到的空位置。
* 返回该共享内存对象的引用标识符。

2) 在向量表shm_segs中查找键值为key的共享内存对象,结果有三:
* 如果没有找到,而且在操作标志shmflg中没有指明要创建新共享内存,则错误返回,否则创建一个新的共享内存对象。
* 如果找到了,但该次操作要求必须创建一个键值为key的新对象,那么错误返回。
* 否则,合法性、认证检查,如有错,则错误返回;否则,返回该内存对象的引用标识符。

共享内存对象的创建者可以控制对于这块内存的访问权限和它的key是公开还是私有。如果有足够的权限,它也可以把共享内存锁定在物理内存中。

void *shmat(int shmid,char *shmaddr(NULL),int shmflg); //用于将共享内存区域映射到本进程空间
int shmid是那块共享内存的ID,也就是shmget的返回值
char *shmaddr是共享内存的起始地址
int shmflag是本进程对该内存的操作模式。如果是SHM_RDONLY的话,就是只读模式。其它的是读写模式
成功时,这个函数返回共享内存的起始地址。失败时返回-1


例子
#include <stdio.h>
#include <stdlib.h>

#define BUFSIZE 2048

int main()
{
int shmid;      //共享内存id号
char *shmadd;   //创建本进程的共享内存映射空间
if((shmid=shmget(IPC_PRIVATE,BUFSIZE,0666))<0) //第一个参数固定,第二个参数是2k内存,第三个参数是可读可写
{
//创建共享内存失败,出错处理
}else
{
system("ipcs -m");      //执行系统命令, ipcs -m 进程间通讯状态 -m 活动的
printf("-----------------------------------\n");
}
shmaddr=shmat(shmid,NULL,0);        //将共享映射到本进程空间,并返回共享内存的地址
system("ipcs -m");      //执行系统命令, ipcs -m 进程间通讯状态 -m 活动的
printf("-----------------------------------\n");
shmadt(shmdt(shmaddr)); //断开映射
system("ipcs -m");      //执行系统命令, ipcs -m 进程间通讯状态 -m 活动的
printf("-----------------------------------\n");
}

转载于:https://www.cnblogs.com/flyxiang2010/archive/2010/12/17/1909107.html

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

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

相关文章

SQL Server 2012 安装

SQL Server 2012 安装 安装包在这里&#xff1a;https://pan.baidu.com/s/1_sgxN8P-pzj7uZeAR0VlKQ 提取码&#xff1a;mnvj 文件比较大&#xff0c;慢慢下载吧 下载好后是这样的&#xff1a; 双击打开&#xff0c;点击 setup.exe 安装&#xff1a; 选择“安装”&#xff0…

矢量数据导入数据库

打开数据导入工具 设置数据库链接 用户名和密码都是postgres 链接成功 arcgis10.3之前编码是gbk之后为utf-8 目前作者用的是10.2版本导出的数据 shp文件名和路径名必须为英文 添加数据 成功导入 追加表的属性要一致 查看导入数据 查看是否导入成功 创建两个字段

@qualifier注解_常见的 Spring 注解概览

点击上方 Java后端&#xff0c;选择 设为星标优质文章&#xff0c;及时送达从Java5.0开始&#xff0c;Java开始支持注解。Spring做为Java生态中的领军框架&#xff0c;从2.5版本后也开始支持注解。相比起之前使用xml来配置Spring框架&#xff0c;使用注解提供了更多的控制Sprin…

IOCP

select()或是其它异步方法不同的是&#xff0c;一个套接字[socket]与一个完成端口关联了起来&#xff0c;然后就可继续进行正常的Winsock操作了。然而&#xff0c;当一个事件发生的时候&#xff0c;此完成端口就将被操作系统加入一个队列中。然后应用程序可以对核心层进行查询以…

经纬度转XY坐标-批量转换

excel存储的经纬度坐标&#xff0c;如何批量转换为XY平面坐标呢&#xff1f; 1.把度分秒转成度小数&#xff1a; 函数为&#xff1a;MID(B2,1,3)MID(B2,5,2)/60MID(B2,8,5)/3600 转换失效的需要补成两位数&#xff0c;如图 2.将文件另存为97-2003版本的excel&#xff0c;后缀…

【转载】C++读写ini配置文件GetPrivateProfileString()WritePrivateProfileString()

配置文件中经常用到ini文件&#xff0c;在VC中其函数分别为&#xff1a;#include <Windows.h> //wince,WMobile.ppc不支持这几个函数写入.ini文件&#xff1a;bool WritePrivateProfileString(LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString, LPCTSTR lpFileNa…

python代码设计测试用例_Python单元测试与测试用例简析

Python单元测试与测试用例简析 发布时间&#xff1a;2019-11-20 22:03 来源&#xff1a;互联网 当前栏目&#xff1a;web技术类 本文实例讲述了Python单元测试与测试用例。分享给大家供大家参考&#xff0c;具体如下&#xff1a; 单元测试与测试用例 简介 测试用例是一组单元测…

数据库备份与恢复

备份 数据库的恢复 新建数据库邮件恢复

贪心算法精讲

一&#xff0e;贪心算法的基本概念 当一个问题具有最优子结构性质时&#xff0c;我们会想到用动态规划法去解它。但有时会有更简单有效的算法。我们来看一个找硬币的例子。假设有四种硬币&#xff0c;它们的面值分别为二角五分、一角、五分和一分。现在要找给某顾客六角三分钱。…

Arcgis将shp图投影坐标转换地理坐标,投影失败的问题

问题来源&#xff1a; 目的&#xff1a;shp图需要将投影坐标系去掉&#xff0c;即投影坐标系转换为地理坐标系 正常操作&#xff1a; 法1&#xff1a;使用Arcgis中工具箱-数据管理工具-投影与变换-要素-投影&#xff0c;&#xff1a;这个工具进行坐标转换 法2&#xff1a;转换…

c#调用.exe程序

using System.Diagnostics; //需要添加这行引用&#xff0c;关于线程的 private void button1_Click(object sender, EventArgs e){ string path "C:\Program Files\Tencent\QQ\QQ.exe"; //这个path就是要调用的exe程序的绝对路径 System.Diagnostics…

idea创建maven项目

如果没有配置这个参数&#xff0c;在maven生成骨架的时候将会非常慢&#xff0c;有时候直接卡住。archetypeCatalog表示插件使用的archetype元数据&#xff0c;不加这个参数时默认为remote&#xff0c;local&#xff0c;即中央仓库archetype元数据&#xff0c;由于中央仓库的ar…

Mapgis图转换为可导入软件的shp

可导入软件的矢量图格式如图&#xff0c;是shp文件&#xff0c;由6个文件构成&#xff1a; 而从Mapgis中导出的shp格式缺少文件&#xff0c;需要将其导入ArcGIS再次导出&#xff0c;补充相关文件。 另外&#xff0c;软件默认的坐标系是WGS-84&#xff0c;不过其他坐标系也可以…

mapgis格式转arcgis的shp格式

转shp 经过试验发现&#xff0c;1.投影坐标系直接转shp的时候不仅会出现位置不正确而且还会出现属性不正确&#xff0c;2.e00数据导入&#xff0c;arcmap2shp软件都会存在一些小问题&#xff0c;可能是作者操作有误导致出现一系列问题 以下介绍个人尝试后没有错误的方法 先将…

高斯投影坐标系为什么是六七八位数

坐标系分为地理坐标系和平面坐标系 地理坐标系 也叫“大地坐标系”&#xff0c;基于地球椭球体建立的坐标系&#xff0c;以经纬度表示&#xff0c; 单位是度分秒&#xff08;10824′34″&#xff09;&#xff0c;或度小数&#xff08;108.24356710&#xff09; 平面坐标系 …

五大算法之三--贪心算法

一、基本概念&#xff1a;所谓贪心算法是指&#xff0c;在对问题求解时&#xff0c;总是做出在当前看来是最好的选择。也就是说&#xff0c;不从整体最优上加以考虑&#xff0c;他所做出的仅是在某种意义上的局部最优解。贪心算法没有固定的算法框架&#xff0c;算法设计的关键…

神经网络与深度学习——TensorFlow2.0实战(笔记)(一)

第一章人工智能的起源和发展 人工智能是一门融合了计算机科学、数学、生物学、脑神经学、 心理学和哲学等多种学科的综合性学科。 弱人工智能 ( Artificial Narrow Intelligence , ANI) 拥有某种特定领域智能行为&#xff0c;替代人类从事某些活动。 强人工智能 ( Artificia…

地图矢量化

地图矢量化&#xff0c;将影像图中的路网、河流等绘制成shp图&#xff0c;需要放大图片细细描摹&#xff0c;工作量很大&#xff0c;因此可以先借助一些已有的公开矢量数据&#xff0c;再进行补充绘制。 下载公开矢量数据 网站&#xff1a;全国地理信息资源目录服务系统 http…

图幅号与经纬度的换算

图幅号&#xff0c;如“I48E001004”&#xff0c;一般为10位数。 前三位“I48”表示所属1:100万图幅的行列号 &#xff0c;地图基本都是在1:100万比例尺的行列式编号基础上划分的。 1:100万图幅的划分规则&#xff1a; 纬度行&#xff1a;从赤道开始算&#xff0c;纬度四度…

五大算法之二--动态规划

动态规划--简单的理解 这个算法简单的来讲就是采用自底向上的方式递推求值&#xff0c;将待求解的问题分解成若干个子问题&#xff0c;先求解子问题&#xff0c;并把子问题的解存储起来以便以后用来计算所需要求的解。简言之&#xff0c;动态规划的基本思想就是把全局的问题化为…