共享内存使用

内存共享是进程通信最快的手段,不需要多次转存数据就可实现的数据交换。

等同于将一块共享内存拼接到进程用户空间,不需要再通过内核参与数据的传输

使用共享内存的步骤:

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);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值