目录
1.shmget(share_memory_get获得共享内存)
3.shmat(share_memory_attaintion挂接到物理内存上)
[5.ipc 指令](#5.ipc 指令)
6.shmdt函数(share_memory_detach取消挂接)
7.shmctl函数(share_memory_contrl)
1.原理
进程间通信的本质就是:让不同的进程看到同一份资源。(和匿名通道和命名通道一样的道理)
共享内存一样需要内核结构体描述它,再组织。
2.接口
1.shmget(share_memory_get获得共享内存)
这边的size最好是4096(4KB)的整数倍,学过内存分配的知道,一般给物理内存分配的资源都是4kb的分配的,即使你要1字节,也会开辟4kb的内存。
但是我们看到这个函数,我们就会发问题了,key哪里来?所以我们在创建一个共享内存时,要先创建一个key值出来!
2.ftok
这两个形参是由用户自己规定。
3.shmat(share_memory_attaintion挂接到物理内存上)
题外:我们C语言中malloc开辟内存,其实只是在页表上开辟的内存,当代码运行到用这个内存的时候,发生缺页中断,才会在物理内存上开辟。
我们上面shmget是在物理内存上开辟共享内存空间,但是我们需要从页表和物理内存上建立联系,才能真正用到这上面!
其中shmaddr是在进程地址空间共享区的具体位置,但是我们不知道,就直接默认nullptr就好了,shmflg一样0就好了。
4.key和shmid的区别
5.ipc 指令
当完成上述函数,共享内存其实已经创建出来了,当然是由函数来删除这个共享内存的,但我现在想先将一下linux的指令,是如何查看和删除的。
6.shmdt函数(share_memory_detach取消挂接)
有挂接到物理内存,那就有取消,下面最后一个函数,一样道理,是取消共享内存!
7.shmctl函数(share_memory_contrl)
1.cmd参数
shmid_ds结构体下面属性会讲。
3.代码呈现
log.txt的日志代码在:Linux命名管道-CSDN博客有说。
comm.hpp
代码运行结果:
4.谈谈优缺点
1.共享内存没有像管道那样的同步互斥之类的保护机制。
2.共享内存是所有进程间通信速度最快的,因为他拷贝少,直接读取内存,而通信则需要在自己的用户层缓冲区(数组)先拷贝,再拷贝到管道上,在从管道拷贝到另一个用户层缓冲区。
3.共享内存内部的数据,有自己维护。