【Linux | 项目】数据加密传输平台(二、组件开发——统一共享内存组件)

组件开发

统一共享内存读写组件

常用底层API:

  • int shmget(key_t key, size_t size, int shmflg);获取一块共享内存。参数key为非016进制数,描述共享内存状态;size为共享内存大小;shmflg为表示共享内存状态。返回int类型的shmid
  • void *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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值