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
- 原生JS | 随机抽取不重复的数组元素 —— 有没有更好的方法?
- 原生JS | 逻辑操作符的短路问题
- 数字识别,从KNN,LR,SVM,RF到深度学习
- 原生JS | 数据类型检测,并没你想象的那么简单
- Excel 有哪些可能需要熟练掌握而很多人不会的技能?
- 原生JS | 值类型与引用类型变量
- 【编程基础】C语言内存使用的常见问题
- kmeans聚类理论篇K的选择(轮廓系数)
- 算法之旅 | 选择排序法
- 【专业技术】Android数据保存之SharedPreferences
- 【答疑解惑】Java中的高精度数字
- 2000! | 看上去如此简单的面试题,让太多“前端”英雄好汉折戟
- 【Windows编程】系列第六篇:创建Toolbar与Statusbar
- arguments,想说爱你不容易
- 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 数组属性和方法
- 工作中巧用了这几个设计模式重构代码,女同事直呼666
- SourceMap知多少:介绍与实践
- (实战)Node.js 实现抢票小工具&短信通知提醒
- 目标检测 | Anchor free之CenterNet深度解析
- C++第二章 变量与基本类型
- springboot2结合mybatis拦截器实现主键自动生成
- 学习一下Python3的协程
- Android网络收集和ping封装库
- Kubernetes之helm部署使用
- 想掌握 Binder 机制?驱动核心源码详解和Binder超系统学习资源,想学不会都难!
- leetcode链表之回文链表
- Docsify 安装
- Docsify 初始化文件夹
- ELK 日志系统集成 Skywalking 调用链 ID
- ChartCenter ——为您的K8s之旅保驾护航v