C++下shm共享内存模块
时间:2022-07-23
本文章向大家介绍C++下shm共享内存模块,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
共享内存(这是IPC最快捷的方式)
是什么
我的第一个服务器项目分了前后端,而其中前后端的数据通讯就是使用shm共享内存的方式,所以对于这块会比较有感觉。
1、共享内存是在多个进程之间共享内存区域的一种进程间的通信方式。 2、它是在多个进程间通过对指定内存段进行映射实现内存共享的。 3、这是IPC最快捷的方式,因为它没有中间商赚差价。 4、多个进程间共享的是同一块物理空间,仅仅是挂载地址不同而已,因此不需要进行复制,可以直接使用这段空间。
怎么用
1、创建共享内存函数shmget()
/*shmget函数用于创建一个新的内存段,或者打开一个原有的内存段*/
#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);
参数释义:shmflg取值范围:IPC_CREAT、IPC_EXCL
2、共享内存挂载到进程下函数shmat()
//该函数用于将开辟好的共享内存挂载到本进程名下
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid,const void *shmaddr,int shmflg);
参数释义: shmid:上面那个函数的返回值。 shmaddr:一般放0,系统就会自己去找一块为映射的地址。
3、断开共享内存连接函数shmdt()
//从进程中删除共享内存与从内核中删除共享内存是两个概念
#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr);
4、共享内存控制函数shmctl()
#include <sys/types.h>
#include <sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
参数释义: cmd:IPC_STAT:获取内存段的shmid_ds结构,用buf传出。 IPC_SET:设置内存段中的shmid_ds结构下的ipc_perm成员的值,从buf里面获得。 IPC_RMID:标记某个内存段,已备删除。(只有当连接该内存段的最后一个进程与他断开连接之后才会执行删除)
struct shmid_ds
{
struct ipc_perm msg_perm; //后面写
size_t shm_segsz; //段大小,以字节为单位
time_t shm_atime; //最后挂载时间
time_t shm_dtime; //最后卸载时间
time_t shm_ctime; //最后修改时间
pid_t shm_cpid; //建立者
pid_t shm_lpid; //最后一个at/dt操作的进程PID
shmatt_t shm_nattch; //现挂载数量
···
}
//下面这个是关键
struct ipc_perm
{
key_t key; //键值
uid_t uid;
gid_t gid; //用户GID
uid_t cuid;
gid_t cgid; //建立者GID
unsigned short mode;//权限
unsigned short seq; //序列号
}
我的服务器shm模块 提取码:r3ne
- 龙门阵之 DevOps 门外汉须知
- 全面进阶 H5 直播(上)
- 这年头,不会斗图都毕不了业?
- 龙妈也会死?《权力的游戏》 AI 算法预测丹妮女王危在旦夕
- 腾讯云 GAME-TECH 沙龙干货回顾:海外网络拓展及质量把控
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
- 腾讯云GAME-TECH沙龙干货回顾:腾讯游戏云全球化实践
- 腾讯云GAME-TECH沙龙干货回顾:猎豹游戏出海经验分享
- 腾讯云GAME-TECH沙龙干货回顾:绿洲全球化案例分享
- 基于云计算的 CV 移动交互应用研究(1):CV交互+云计算
- ARKit 进阶:物理世界
- HLS 视频点播初探
- 周杰伦读心术背后的技术实现
- 盒子端 CSS 动画性能提升研究
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C++ 智能指针
- python实现线性回归之lasso回归
- 分页查询 offset 和 limit 和 limit 的区别
- mybatis文件映射之获取参数值时#和$的区别
- python实现线性回归之岭回归
- 操作系统实验之存储管理
- MySQL EXPLAIN 的使用
- mybatis文件映射之关联查询初探(一)
- python实现线性回归之弹性网回归
- 【原创】python倒排索引之查找包含某主题或单词的文件
- python实现逻辑回归
- Linux文件管理参考
- CloudBase Framework丨第一个 Deno 部署工具是如何打造的?
- 关于null通过+" ",String.ValueOf转换为字符串的问题!!!
- Java实现尺取法