组件开发
统一共享内存读写组件
常用底层API:
int shmget(key_t key, size_t size, int shmflg);
获取一块共享内存。参数key为非016进制数,描述共享内存状态;size为共享内存大小;shmflg为表示共享内存状态。返回int类型的shmidvoid *shmat(int shmid, const void *shmaddr, int shmflg);
获取指定共享内存的操作指针。参数shmid为共享内存ID标识;shmaddr为用户指定的共享内存地址,一般传NULL由内核自动分配;shmflg为指定共享内存的权限int shmdt(const void *shmaddr);
取消当前进程与共享内存的关联关系。参数shmaddr共享内存的地址,传入shmat的返回值即可int shmctl(int shmid, int cmd, struct shmid_ds *buf);
对共享内存进行操作。参数shmid为共享内存ID标识;cmd为命令;buf为传出参数
一般用shmctl的IPC_RMID命令删除未关联任何进程的共享内存。如果被删除的共享内存仍关联其他进程,则共享内存的key值变为0x0000,此时为private私有状态,只能在已经关联的进程中进行通信。共享内存被标记为将要删除的内存,且不能有新的进程关联此共享内存。等到所有关联进程执行结束或者取消与共享内存的关联,即共享内存引用计数为0时自动删除该共享内存
Linux内核管理共享内存的方法:
- key值描述共享内存的状态,0x0000表示private,非0表示shared
- 引用计数
封装共享内存操作
创建共享内存:int IPC_CreateShm(int key, int shmsize, int *shmhdl);
打开共享内存:int IPC_OpenShm(int key, int shmsize, int *shmhdl);
关联共享内存:int IPC_MapShm(int shmhdl, void **mapaddr);
取消共享内存关联:int IPC_UnMapShm(void *unmapaddr);
删除共享内存:int IPC_DelShm(int shmhdl);
具体实现见myipc_shm.c