共享内存
共享内存是被多个进程共享的一部分物理内存;
写入共享内存后,数据不会消失,可以一直读取;
再次向共享内存中写入,会覆盖原来的数据,即每次写数据都是从相同的位置上写(从shmat函数返回的地址开始写)
多进程想要进程数据通信,就得把这块共享内存映射到自己的虚拟地址空间,其在虚拟地址空间的位置:
共享内存是一个共享资源,本身不提供同步机制,可通过信号量进行同步;
是最高效的IPC机制;
共享内存的属性:
共享内存的使用步骤:
1. 调用shmget函数创建共享内存
2. 调用shmat函数将创建的共享内存映射到进程的虚拟内存空间中
共享内存的创建:
int shmget(key_t key,size_t size,int shmflg)
成功返回内核中共享内存的标识id,失败-1
参数:
key:用户空间的唯一标识key
size:共享内存的大小
shmflg:IPC_CREAT、IPC_EXCL等
共享内存的控制:
int shmctl(int shmid,int cmd,struct shmid_ds *buf)
成功返回0,失败-1
参数:
shmid:共享内存id
buf:共享内存属性指针
cmd:
IPC_STAT 获取共享内存属性
IPC_SET 设置共享内存属性
IPC_RMID 删除共享内存
IPC_LOCK 锁定共享内存页面(映射的物理内存不和外存进行换入换出操作)
IPC_UNLOCK 解除锁定共享内存页面
共享内存的映射和解除映射:
void* shmat(int shmid,char *shmaddr,int shmflg)
成功返回共享内存映射到进程虚拟内存地址空间中的地址,失败-1
int shmdt(char *shmaddr)
失败-1
参数:
shmid:共享内存id
shmaddr:映射到进程虚拟内存空间的地址(可以人为指定),但建议设置为0,表示由系统分配
shmflg:若shmaddr设置为0,shmflg也设置为0
子进程不继承父进程创建的共享内存,是共享的。子进程继承父进程映射的地址。