共享内存就是借助同一块物理内存映射不同的虚拟地址空间,不同的虚拟地址空间代表着不同的进程,所以多个进程都能看到这一块内存,那么就可以同时对这块内存读写操作。
我们画张图感受一下:
共享内存是一块内存,它的数据结构中都有以下数据
shmget函数:用来创建共享内存
int shmget(key_t key,size_t size,int shmflg); //key共享内存段的名字 //size:共享内存大小(返回的大小等于size向上取整到4k的整数倍例如size=4097,那么返回的内存大小为8k即为两页) //shmflg:权限 //返回值:成功返回一个非负整数(内存标识码),失败返回-1;
shmat函数:将共享内存连接到进程地址空间
void* shmat(int shmid,const void* shmaddr,int shmflg); //shmid:共享内存标识码 //shmaddr:连接的地址 //shmflg:有两个取值可能是SHM_RND和SHM_RDONLY //返回值:成功返回一个指针,指向共享内存第一个字节,失败返回-1 ************************************************************** 说明 1、shmaddr为NULL,内核自动选择一个地址 2、不为NULL,如果shmflg设置了SHM_RND标记,那么连接的地址会自动向下调整为SHMLBA的整数倍(shmaddr-(shmaddr%SHMLBA);如果没有设置SHM_RND标记那么shmaddr就是连接的地址。 3、shmflg=SHM_RDONLY,表示连接操作用来只读共享内存
shmdt函数:将共享内存段与当前进程脱离
int shmdt(const void* shmaddr); //shmaddr:是shmat返回的shmaddr //返回值:失败返回-1,成功返回0 <font color=red>注意:</td>
文章来源: 进程间通信----------共享内存