1.共享内存数据结构

2.共享内存函数

#include <sys/ipc.h>
#include <sys/shm.h>

int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

3.shmget函数

(1)原型:int shmget(key_t key, size_t size, int shmflg);

(2)功能:用来创建共享内存

打开一个已经存在共享内存, 如果打开时不知道共享内存的大小, 可以将size指定为0, shmflg可以指定为0(按照默认的权限打开);

(3)参数:

key:这个共享内存段名字;

size:共享内存大小(bytes);

shmflg:用法类似msgget中的msgflg参数;

(4)返回值:

成功返回一个非负整数,即该共享内存段的标识码;失败返回-1

4.shmat函数

(1)原型:void *shmat(int shmid, const void *shmaddr, int shmflg);

(2)shmaddr为NULL,核心自动选择一个地址

(3)shmaddr不为NULL且shmflg无SHM_RND标记,则以shmaddr为连接地址

(4)shmaddr不为NULL且shmaddr设置了SHM_RND标记,则连接的地址会自动向下调整为SHMLBA的整数倍。公式:shmaddr-(shmaddr % SHMLBA)

(5)shmflg=SHM_RDONLY,表示连接操作用来只读共享内存

5.shmctl函数

(1)功能:用来设置或获取一个共享内存

(2)原型:int shnctl(int shnid, int cmd, struct shmid_ds* buf);

(3)参数:shmid:由shmget返回的共享内存标识码

cmd:将要采取的动作(由三个可取值)

buf:指向一个保存着共享内存的模式状态和访问权限数据结构

(4)返回值:成功返回0,;失败返回-1

6.shmdt函数

(1)原型:int shmdt(const void *shmaddr);

(2)参数:shmaddr: 由shmat所返回的指针

(3)注意:将共享内存段与当前进程脱离不等于删除共享内存段

7.示例

shmwrite.cpp

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)typedef struct stu {char name[32];int age;
}STU;int main(int argc, char* argv[]) {int shmid;shmid = shmget(1234, sizeof(STU), IPC_CREAT | 0666);if(shmid == -1) {ERR_EXIT("shmget");}STU* p;p = (STU*)shmat(shmid, NULL, 0);if((void*)-1 == p) {ERR_EXIT("shmat");}strcpy(p->name, "lisi");p->age = 20; //sleep(10);while(1) {if(memcmp(p, "quit", 4) == 0) {   break;}}shmdt(p);shmctl(shmid, IPC_RMID, NULL);return 0;
}

shmread.cpp

#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/shm.h>#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>#define ERR_EXIT(m) \do \{ \perror(m); \exit(EXIT_FAILURE); \}while(0)typedef struct stu {char name[32];int age;
}STU;int main(int argc, char* argv[]) {int shmid;shmid = shmget(1234, 0, 0);if(shmid == -1) {ERR_EXIT("shmget");}STU* p;p = (STU*)shmat(shmid, NULL, 0);if((void*)-1 == p) {ERR_EXIT("shmat");}printf("name = %s age = %d\n", p->name, p->age);memcpy(p, "quit", 4);shmdt(p);return 0;
}

system v共享内存相关推荐

  1. Linux进程间通信一 System V 共享内存简介与示例

    目录 1. System V共享内存简介 2. API介绍 2.0 key_t和标识符 2.1  创建system v共享内存 2.2 映射共享内存并使用 2.3 取消共享内存映射 2.4 控制共享内 ...

  2. mmap内存映射、system V共享内存和Posix共享内存

    linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...

  3. 阐述linux IPC(五岁以下儿童):system V共享内存

    [版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途]         system V共享内存和posix ...

  4. linux环型共享内存,Linux system v 共享内存

    system v 共享内存 #include #include int shmget(key_t key, size_t size, int shmflg); 建立:进程与共享内存的关联关系 key_ ...

  5. Linux IPC实践(9) --System V共享内存

    共享内存API #include <sys/ipc.h> #include <sys/shm.h>int shmget(key_t key, size_t size, int ...

  6. 嵌入式Linux系统编程学习之二十三 System V 共享内存机制

    文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言   共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...

  7. 共享内存之——system V共享内存

    System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...

  8. 【校招 --阶段一 系统编程】system V共享内存

    一.什么是system V共享内存 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此 ...

  9. 【Linux】进程间通信 - 匿名/命名管道与System V共享内存

    目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...

  10. 【Linux篇】第十二篇——进程间通信(管道+system V共享内存)

    进程间通信介绍 概念 目的 本质 分类 管道 什么是管道 匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 管道读写规则 管道的特点 管道的大小 命名管道 命名管道的原理 使用命令创建命名管道 ...

最新文章

  1. Win2D 官方文章系列翻译 - 避免内存泄漏
  2. ARM中C和汇编混合编程及示例
  3. oracle和mysql数据实时同步_异构数据源的CDC实时同步系统——最终选型实战
  4. Vue 中使用element ui 自定义邮箱和手机号的效验规则
  5. 用MDT 2012为企业部署windows 7(三)--安装MDT 2012,ADK以及安装后情况
  6. MATLAB多算法进行图像去雾处理
  7. 使用IPv6下载google drive 大文件
  8. ANSYS or Abaqus? 一个过来人的工作感悟
  9. 对某在线教育平台用户使用RFM模型按价值分类
  10. VR开发之使用VRTK实现拾取和手柄扣下扳机触发事件(Unity灭火器灭火功能的实现)
  11. 修改Android模拟器中System目录的内容(framework.jar)
  12. 平安好医生发布半年报,“关键先生”方蔚豪寻求变阵|看财报
  13. 养活一团春意思,撑起两根穷骨头
  14. 云服务器BBC销售渠道,云服务器bbc什么意思
  15. fine ui grid控件添加行号
  16. 推荐系统中的常用算法——序列深度匹配SDM
  17. 实验9.1 递归计算函数值Ack(m,n)的值
  18. MyBatis-Plus--开胃菜
  19. 企业微信如何能快速加好友呢? 有什么工具能批量导入好友吗?
  20. Google Earth Engine(GEE)——将GEE中的土地分类数据转化成矢量并导出

热门文章

  1. Laravel教程 六:表单 Forms
  2. android键盘事件
  3. 将windows7安装到映像文件方法总结
  4. C/C++ volatile
  5. 图片 和 base64 互转
  6. R文件报错:cannot resolve symbol ‘R’
  7. 用隐喻来更充分地理解软件开发
  8. Django uplodify 多文件同时上传
  9. hbase 特性与api
  10. 深入学习typedef和typename