共享内存
共享内存是可以被多个进程共享访问的一部分物理内存,如果多个进程都把一个内存区映射到自身的虚拟地址空间,则这些进程就可以直接访问该共享的内存区域,从而通过共享内存的方式实现多进程间的通讯,共享内存是进程间数据通讯的最快方法.
共享内存的实现分为两步:
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

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

  1. IMX6ULL嵌入式Linux驱动学习笔记(二)

    IMX6ULL嵌入式Linux驱动学习 一.字符设备驱动 二.驱动模块的加载与卸载 三.字符设备的注册与注销 四.设备号 五.file_operations的具体实现 六.字符设备驱动框架 七.编写应 ...

  2. 用OpenJTAG烧写程序到Flash—— 韦东山嵌入式Linux视频学习笔记03

    说明:本文仅在Windows环境下实验. 韦东山的JZ2440(v2),可以选择从Nor Flash启动,也可以选择从Nand Flash启动,不管从哪里启动,都需要Flash上有程序,没有程序的话, ...

  3. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(1)

    文件锁-文件共享 共享资源竞争问题的解决方法:文件锁. 文件锁包括 建议性锁 要求每个上锁文件的进程都要检查是否有锁存在,并且尊重 已有的锁 强制性锁 由内核执行的锁,当一个文件被上锁进行写入操作的时 ...

  4. 如何告别半途而废——韦东山嵌入式Linux视频学习笔记00

    今天终于从柜子里翻出了韦东山的板子--JZ2440(V2),又翻出了当时买板子赠送的光盘,是的,我又要重新学习了.其实说"重新"是不对的,我当初就没有学完,学到一半放弃了(惭愧啊) ...

  5. 关于JTAG——韦东山嵌入式Linux视频学习笔记02

    1. JTAG的字面意思 JTAG --Joint Test Action Group,联合测试行动组. 2. JTAG标准 随着技术的发展,芯片的结构和功能越来越复杂,传统的使用万用表.示波器测试芯 ...

  6. 嵌入式Linux基础学习笔记-文件IO编程-文件锁(2)

    文件操作仿真FIFO,实现生产者-消费者运行模型 编程实现生产者程序producer.c,创建仿真FIFO结构文件(普通文件),按照给定的时间间隔向FIFO文件写入自动生成的字符(自定义),生产周期及 ...

  7. 嵌入式linux的学习笔记-pipe管道(二)

    今天学习了一下pipe管道,用于父子或者相关联的两个进程之间的通讯,pipe使用 pipe()函数建立,必须用于fork建立的进程中,并且需要在fork之前调用,否则是没有效果的,下面是一个例子和用法 ...

  8. 用J-Link烧写u-boot到Nor Flash—— 韦东山嵌入式Linux视频学习笔记04

    说明:本文的实验环境为Windows7+JZ2440 J-Link 只支持烧写 Nor Flash,不支持烧写 Nand Flash(为什么呢?先不探究原因). 如果想烧写程序到Nand Flash, ...

  9. 开发板的I/O在哪里——韦东山嵌入式Linux视频学习笔记01

    一般来说,串口就是开发板的I/O(输入输出)接口.我们可以通过串口向板子发送命令,也可以通过串口把板子的状态信息打印出来. 板载串口和PC的连接 如果板子上有串口,且电脑上也有串口,那直接用串口线相连 ...

最新文章

  1. 让浏览器判断html为手机页面,判断是从手机端还是客户端访问的页面,判断浏览器类型...
  2. vue - 响应式原理梳理(一)
  3. 【Python】实战多word的内容合并筛选及输出
  4. 模块讲解----shutil模块(copy、压缩、解压)
  5. 11.Wave Shader
  6. php汽车之家数据api,基于聚合数据的全国违章直连查询接口示例-PHP版
  7. js显示PHP源代码命令,layedit富文本编辑器中如何添加显示源码功能(代码)
  8. java word转pdf_java里实现Word转PDF的几种方案
  9. Javascript隐式数据类型转换(==、+、Object)
  10. transactionscope 中的异步 处理 异常_PLC编程中的异常处理
  11. 人工智能学习(二)安装tensorflow与pytorch
  12. 2019年,我们需要加强关注网络安全的6大原因
  13. python复制csv数据_如何使用Python将CSV数据复制到现有xlsx文件
  14. VS2019删除空白行
  15. STM32开发 --- W25Q128读写、SPI通信
  16. 计算机软件是互联网行业吗,中国十大热门专业 互联网行业位居第一
  17. 常见的系统漏洞安全扫描修复总结归纳
  18. 小程序rich-text中实现图片预览
  19. 关于XP、2k、98的互访的问题的总结
  20. 四十岁想跳槽,年龄是最大的障碍吗?

热门文章

  1. fiddler手机端抓包配置
  2. Head First设计模式之备忘录模式
  3. 在caffe中使用hdf5的数据
  4. 查看WEB服务器的连接数
  5. .Net读取xlsx文件Excel2007
  6. MyEclipse2015双击不能打开文件
  7. 那些对你说学历不重要,技术重要的人,他们大部分都是有学历的。
  8. 支付宝支付-支付宝PC端扫码支付
  9. Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
  10. ORA-27101 shared memory realm does not exist 错误处理