C++下shm共享内存模块

网友投稿 849 2022-05-29

我的第一个服务器项目分了前后端,而其中前后端的数据通讯就是使用shm共享内存的方式,所以对于这块会比较有感觉。

1、共享内存是在多个进程之间共享内存区域的一种进程间的通信方式。

2、它是在多个进程间通过对指定内存段进行映射实现内存共享的。

3、这是IPC最快捷的方式,因为它没有中间商赚差价。

4、多个进程间共享的是同一块物理空间,仅仅是挂载地址不同而已,因此不需要进行复制,可以直接使用这段空间。

1、创建共享内存函数shmget()

/*shmget函数用于创建一个新的内存段,或者打开一个原有的内存段*/ #include #include int shmget(key_t key,size_t size,int shmflg);

1

2

3

4

参数释义:shmflg取值范围:IPC_CREAT、IPC_EXCL

2、共享内存挂载到进程下函数shmat()

//该函数用于将开辟好的共享内存挂载到本进程名下 #include #include void *shmat(int shmid,const void *shmaddr,int shmflg);

1

2

3

4

参数释义:

shmid:上面那个函数的返回值。

shmaddr:一般放0,系统就会自己去找一块为映射的地址。

3、断开共享内存连接函数shmdt()

//从进程中删除共享内存与从内核中删除共享内存是两个概念 #include #include int shmdt(const void *shmaddr);

1

2

3

4

4、共享内存控制函数shmctl()

#include #include int shmctl(int shmid,int cmd,struct shmid_ds *buf);

1

2

3

参数释义:

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; //序列号 }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

C++下shm共享内存模块

23

24

我的服务器shm模块

提取码:r3ne

C++ 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何快速方便的生成好看的接口文档(apipost生成文档)
下一篇:laravel 共享session问题总结
相关文章