内存共享是进程通信最快的手段,不需要多次转存数据就可实现的数据交换。
等同于将一块共享内存拼接到进程用户空间,不需要再通过内核参与数据的传输
使用共享内存的步骤:
1、创建共享内存
int shmget(key_t key, size_t size, int shmflg);
参数:
key:整型,通过key找到或创建一个共享内存(不同的进程进行通信时key需要相同)
size:共享内存的字节大小
shmflg:属性 访问权限或附加属性(创建共享内存或判断是否存在共享内存)
//创建共享内存
int shmid = shmget(100,4096,IPC_CREAT);
2、连接共享内存
void *shmat(int shmid, const void *shmaddr, int shmflg);
参数:
shmid:创建共享内存得到的共享标识符
shmaddr:申请的共享内存的起始地址,通常用NULL,由内核指定
shmflg:对共享内存的操作权限,必须要有读权限,SHM_DRONLY表示读权限,0表示可读可写
//连接共享内存
void* ptr = shmat(shmid,NULL,0);
3、对共享内存的读写操作
4、进程断开与共享内存的连接
int shmdt(const void *shmaddr);
参数:
shmaddr:连接共享内存时返回的共享内存首地址
该函数在进程结束时也会自动调用
//断开与共享内存的连接
shmdt(ptr);
5、对共享内存标记删除
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数:
shmid:创建共享内存产生的共享标识符
cmd:要做的操作,有IPC_STAT、IPC_SET、IPC_RMID,IPC_RMID表示标记删除
buf:需要获取或设置的共享内存状态,用shmid_ds结构体接受或传参,若是要标记删除共享内存则设置为NULL
标记删除不是真正删除共享内存,只有当共享内存的进程连接数为0时才会真正删除
//标记删除共享内存
shmctl(shmid,IPC_RMID,NULL);