(。・∀・)ノ゙嗨!你好这里是ky233的主页:这里是ky233的主页,欢迎光临~https://blog.csdn.net/ky233?type=blog
点个关注不迷路⌯'▾'⌯
目录
一、共享内存
1.原理
共享内存顾名思义,就是在内存中堆区和栈区相对,中间还有一个共享内存区,两个进程同时访问,即可完成进程之间的通信!
这里要注意!
我们开辟的共享内存是在虚拟内存上开辟然后在,然后映射到真是的物理内存的,所以双方要进行进程通信直接用内存级别的读写就可以了,这是在堆栈之间开辟的,无需经过系统调用,而管道本质上还是经过文件,这是要有对应的内核数据结构,所以管道要用操作系统来调用!
2.建立
首先共享内存的提供者是操作系统,共享内存也是要经过OS管理的还是经过先描述在组织
所以共享内存=共享内存块+对应的共享内存的内核数据结构
3.shmget和ftok
int shmget(key_t key,size_t size,int shmflg)
- 参数1:两个进程只要是同一个key就可以看到同一个共享内存
- 参数2:需要的共享内存有多大
- 参数3:两个选项,IPC_CREAT(创建内存,如果底层已经存在,就直接获取并返回),IPC_EXCL(单独使用无意义,合起来使用如果底层不存在,则创建并返回,如存在则出错返回,则一定创建一个全新的共享内存)
- 返回值:类似于fd
key_t ftok(const char *pathname,int proi id)
用此函数来形成key值
- 参数1:路径
- 参数2:0~255的任意数
只要两个进程使用同样的pathname,和id那么就会生成唯一key
4.ftok的用法
Server:
int main()
{
key_t k = ftok(PATH_NAME,PROJ_ID);
Log("create key done",Debug)<<"server key:"<<k<<endl;
return 0;
}
Client:
int main()
{
key_t k = ftok(PATH_NAME,PROJ_ID);
Log("create key done",Debug)<<"client key:"<<k<<endl;
return 0;
}
由此我们可以看见两个进程获取的是同一个key值,而且是一个随机值
5.shmctl的用法
当进程运行结束,我们的共享内存还存在!system V IPC资源的生命周期是随我们内核的!
要想删除两种办法
- 1:手动删除
- 2:代码删除
手动删除太麻烦,所以我们可以用shmctl来删除
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
- 参数一:就是shmget创建的id
- 参数二:设置一些属性,如删除
- 参数三:今天我们只是删除,所以设为空即可
6.shmat的用法
我们创建完共享内存之后需要挂接到我们需要的进程的地址空间中,所以我们用这个函数
void *shmat(int shmid,const void *shmaddr,int shmflg)
- 参数一:对应共享内存的id
- 参数二:所要指定的虚拟地址,但一般不建议自己设置一般设为nullptr