system v共享内存
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共享内存相关推荐
- Linux进程间通信一 System V 共享内存简介与示例
目录 1. System V共享内存简介 2. API介绍 2.0 key_t和标识符 2.1 创建system v共享内存 2.2 映射共享内存并使用 2.3 取消共享内存映射 2.4 控制共享内 ...
- mmap内存映射、system V共享内存和Posix共享内存
linux内核支持多种共享内存方式,如mmap内存映射,Posix共享内存,以system V共享内存.当内核空间和用户空间存在大量数据交互时,共享内存映射就成了这种情况下的不二选择.它能够最大限度的 ...
- 阐述linux IPC(五岁以下儿童):system V共享内存
[版权声明:尊重原创.转载请保留源:blog.csdn.net/shallnet 要么 .../gentleliu,文章学习交流,不用于商业用途] system V共享内存和posix ...
- linux环型共享内存,Linux system v 共享内存
system v 共享内存 #include #include int shmget(key_t key, size_t size, int shmflg); 建立:进程与共享内存的关联关系 key_ ...
- Linux IPC实践(9) --System V共享内存
共享内存API #include <sys/ipc.h> #include <sys/shm.h>int shmget(key_t key, size_t size, int ...
- 嵌入式Linux系统编程学习之二十三 System V 共享内存机制
文章目录 前言 一.ftok 函数 二.shmget 函数 三.shmat 函数 四.shmdt 函数 五.shmctl 函数 补充 前言 共享内存也是进程间(进程间不需要有继承关系)通信的一种常 ...
- 共享内存之——system V共享内存
System V 的IPC对象有共享内存.消息队列.信号灯(量). 注意:在IPC的通信模式下,不管是共享内存.消息队列还是信号灯,每个IPC的对象都有唯一的名字,称为"键(key)&quo ...
- 【校招 --阶段一 系统编程】system V共享内存
一.什么是system V共享内存 共享内存区是最快的IPC形式.一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此 ...
- 【Linux】进程间通信 - 匿名/命名管道与System V共享内存
目录 前言 一.管道 0.什么是管道 1).管道的概念 2).管道的本质 3).管道指令: "|" 1.匿名管道 1).如何创建匿名管道 2).如何使用匿名管道进行通信 3).匿名 ...
- 【Linux篇】第十二篇——进程间通信(管道+system V共享内存)
进程间通信介绍 概念 目的 本质 分类 管道 什么是管道 匿名管道 匿名管道的原理 pipe函数 匿名管道使用步骤 管道读写规则 管道的特点 管道的大小 命名管道 命名管道的原理 使用命令创建命名管道 ...
最新文章
- Win2D 官方文章系列翻译 - 避免内存泄漏
- ARM中C和汇编混合编程及示例
- oracle和mysql数据实时同步_异构数据源的CDC实时同步系统——最终选型实战
- Vue 中使用element ui 自定义邮箱和手机号的效验规则
- 用MDT 2012为企业部署windows 7(三)--安装MDT 2012,ADK以及安装后情况
- MATLAB多算法进行图像去雾处理
- 使用IPv6下载google drive 大文件
- ANSYS or Abaqus? 一个过来人的工作感悟
- 对某在线教育平台用户使用RFM模型按价值分类
- VR开发之使用VRTK实现拾取和手柄扣下扳机触发事件(Unity灭火器灭火功能的实现)
- 修改Android模拟器中System目录的内容(framework.jar)
- 平安好医生发布半年报,“关键先生”方蔚豪寻求变阵|看财报
- 养活一团春意思,撑起两根穷骨头
- 云服务器BBC销售渠道,云服务器bbc什么意思
- fine ui grid控件添加行号
- 推荐系统中的常用算法——序列深度匹配SDM
- 实验9.1 递归计算函数值Ack(m,n)的值
- MyBatis-Plus--开胃菜
- 企业微信如何能快速加好友呢? 有什么工具能批量导入好友吗?
- Google Earth Engine(GEE)——将GEE中的土地分类数据转化成矢量并导出