当前位置: 首页 > >

进程间通信(二)(共享内存)

发布时间:

共享内存
通信原理:

开辟一块内存空间,各个进程将同一块物理内存空间映射到自己的虚拟地址空间中,通过虚拟地址进行访问,进而实现数据共享


特性:共享内存是最快的进程间通信方式,直接通过虚拟地址访问物理内存,相比较于其他方式少了两次数据拷贝


操作流程

1,创建或打开共享内存


int shmget(key_t key,size_t size,int shmflg)


key:标识符? 通过相同标识符,多个进程可以打开同一块共享内存


size:要创建的共享内存大小


shmflg:打开方式+权限:? ?IPC_CREAT|IPC_EXCL|0664


返回值:成功:操作句柄? ? ?失败-1


2,与进程建立映射关系


void *shmat(int shmid,const void* shmaddr,int shmflg)


shimid:shmget返回的操作句柄


shmaddr:映射首地址,通常置为NULL


shmflg:? ?SHM_RDONLY--只读? ? ? ? ? 0--可读可写


返回值:成功返回映射后的首地址? ? 失败返回(void*)-1;


3,对共享内存进行内存操作


memcp? ?strcpy等等


4,与进程间解除映射关系


int shmdt(void* shmaddr)


返回值:成功返回0? 失败-1


5,删除共享内存


int shmctl(int shmid,int cmd,stuct shmid_ds *buf)


shmid:shmget返回的操作句柄


cmd:要对共享内存进行操作的类型? ? IPC_RMID--标记要删除的共享内存 映射链接数为0时删除共享内存,禁止新的映射连接


buf:用于获取或设置共享内存属性的


返回值:成功返回0? 失败-1


代码示例如下:






测试结果如下:


运行shmread? 从共享内存中读取数据? 如果共享内存中存在之前写入数据? 将会一直打印之前写入的信息,且不会更新



运行shmwrite后,共享内存中的数据开始更新??




此时注意到,如果一直write向共享内存中写入数据,即使关闭read? ? 更新内存中的数据在后台依然会一直更新



综上总结:

通信原理:开辟一块物理内存,多个进程将同一块内存映射到自己的虚拟地址空间进行访问,进而实现数据共享


特性:


1,效率最高的进程间通信方式


2,生命周期随内核


注意:各个进程对共享内存的操作都是不安全的操作



友情链接: 传奇百科网 招聘百科网 非凡百科网 游艇百科网 口红百科网 创业百科网 软木百科网