#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg);
功能:创建一个新的共享内存段,或者获取一个既有的共享内存段的标识。
新创建的内存段中的数据都会被初始化为0
参数:
-key:通过它可找到或者创建一个共享内存,一般用16进制,非0
-size:共享内存的大小,不能为0
-shmflg:共享内存的属性
-访问权限
-附加属性
返回值:返回一个标识,失败返回-1
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
-功能:和当前的进程进行关联
-参数:
-shmid:共享内存的标识
-shmaddr:申请的共享内存的起始地址,指定NULL,内核指定
-shmflg:对共享内存的操作 SHM_RDONLY(必须要有读权限),读写指定0, SHM_EXEC(可执行权限) ...
返回值:返回共享内存的起始地址,失败返回(void *) -1
#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
功能:解除当前进程和共享内存的关联
参数:
-shmaddr:共享内存的首地址
返回值:成功0,失败-1
#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
功能:对共享内存进行操作
参数:
-shmid:
-cmd:要做的操作
-IPC_STAT:获取状态
-IPC_SET:设置共享内存的状态
-IPC_RMID:标记共享内存被销毁
-buf:要设置或者获取的共享内存的属性信息
返回值:
*/
共享内存和内存映射的区别:
1.共享内存可以直接创建,内存映射需要依赖磁盘文件(匿名映射除外)
2.共享内存效率更高
3.内存:
所有的进程操作的是同一块共享内存
内存映射,每个进程在自己的虚拟地址空间有一个独立的内存
4.数据安全:
-进程突然退出,共享内存还存在,而内存映射区消失
-运行进程的电脑死机
数据存储在共享内存中,没有了
内存映射区的数据,由于磁盘文件中的数据还在,所以内存映射区 数据还在
-生命周期
内存映射区:进程退出,内存映射区销毁
共享内存:进程退出,共享内存还在,标记删除(所有的关联的进程数为0),或者关机
如果一个进程退出,会自动和共享内存取消关联