ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

C++下shm共享内存模块

2021-05-12 17:53:33  阅读:257  来源: 互联网

标签:IPC 共享内存 int C++ shmid include 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

标签:IPC,共享内存,int,C++,shmid,include,shm,内存模块
来源: https://blog.51cto.com/u_15197573/2771621

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有