既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
共享内存概念
共享内存区是最快的IPC(进程间通信)形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。
与管道区别:
1.管道的本质是一个文件,其进程间通信依赖I/O进行操作。而共享内存本质是多个进程共享一份内存,通过读写端不同来达到进程通信的目的。
2.管道在创建默认情况下读端为阻塞模式,而共享内存不会这样。
共享内存的本质。
共享内存的描述与组织
共享内存的描述
共享内存的组织
共享内存的分配原则
以页为基本单位,假设这个页的大小为4k的话,此时你非要去申请4097字节的话,它会给你两页,但是你只能使用4097字节。
共享内存的相关函数
获取key值
因为首先要生成一个唯一的key值,所以必须调用ftok()这个函数
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include"mp.h"
5 using namespace std;
6 int main()
7 {
8 key_t key=ftok(PATH,proj_id);
9 cout<<key<<endl;
10 return 0;
11 }
获取共享内存
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include<sys/shm.h>
5 #include"mp.h"
6 using namespace std;
7 int main()
8 {
9 key_t key=ftok(PATH,proj_id);
10 int shmid=shmget(key,4096,IPC_CREAT|IPC_EXCL);
11 if(shmid<0)
12 {
13 cerr<<"shmget()"<<endl;
14 return 1;
15 }
16 hex(cout);
17 cout<<"my key is "<<key<<endl;
18 dec(cout);
19 cout<<"my shmid is "<<shmid<<endl;
20 return 0;
21 }
介绍两个命令: ipcs -m 查看共享内存
删除共享内存的命令 ipcrm -m + 共享内存的shmid号
上图的perms的值为0,表明我没有任何权限,那要这个共享内存干嘛?所以我们在创建时必须给其加上权限。以八进制方式加
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include<sys/shm.h>
5 #include"mp.h"
6 using namespace std;
7 int main()
8 {
9 key_t key=ftok(PATH,proj_id);
10 int shmid=shmget(key,4096,IPC_CREAT|IPC_EXCL|0664);
11 if(shmid<0)
12 {
13 cerr<<"shmget()"<<endl;
14 return 1;
15 }
16 hex(cout);
17 cout<<"my key is "<<key<<endl;
18 dec(cout);
19 cout<<"my shmid is "<<shmid<<endl;
20 return 0;
21 }
~
删除共享内存
我们可以使用ipcrm -m +shmid 命令删除,但共享内存为什么不能用完不用我们自己手动去释放,而是调用一个函数去释放它,这里介绍。
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include<unistd.h>
5 #include<sys/shm.h>
6 #include"mp.h"
7 using namespace std;
8 int main()
9 {
10 key_t key=ftok(PATH,proj_id);
11 int shmid=shmget(key,4096,IPC_CREAT|IPC_EXCL|0664);
12 if(shmid<0)
13 {
14 cerr<<"shmget()"<<endl;
15 return 1;
16 }
17 hex(cout);
18 cout<<"my key is "<<key<<endl;
19 dec(cout);
20 cout<<"my shmid is "<<shmid<<endl;
21 sleep(10);
22 shmctl(shmid,IPC_RMID,NULL);
23 return 0;
24 }
共享内存的挂载
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include<unistd.h>
5 #include<sys/shm.h>
6 #include"mp.h"
7 using namespace std;
8 int main()
9 {
10 key_t key=ftok(PATH,proj_id);
11 int shmid=shmget(key,4096,IPC_CREAT|IPC_EXCL|0664);
12 if(shmid<0)
13 {
14 cerr<<"shmget()"<<endl;
15 return 1;
16 }
17 hex(cout);
18 cout<<"my key is "<<key<<endl;
19 dec(cout);
20 cout<<"my shmid is "<<shmid<<endl;
W> 21 char\* s=(char\*)shmat(shmid,NULL,0);
22 sleep(10);
23 shmctl(shmid,IPC_RMID,NULL);
24 return 0;
25 }
去除挂载
*int shmdt(const void shmaddr); 只需要将shmat返回值传入即可
1 #include<iostream>
2 #include<sys/ipc.h>
3 #include<sys/types.h>
4 #include<unistd.h>
5 #include<sys/shm.h>
6 #include"mp.h"
7 using namespace std;
8 int main()
9 {
10 key_t key=ftok(PATH,proj_id);
11 int shmid=shmget(key,4096,IPC_CREAT|IPC_EXCL|0664);
12 if(shmid<0)
13 {
14 cerr<<"shmget()"<<endl;
![img](https://img-blog.csdnimg.cn/img_convert/16432f9b8027ed1b7d9ed784e4e19dc4.png)
![img](https://img-blog.csdnimg.cn/img_convert/9bcca864deee755d2a62e835305d2625.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**
..(img-jE48O4RC-1715767598288)]
[外链图片转存中...(img-UggVsFfj-1715767598288)]
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!**
**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**
**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618668825)**