学习笔记之共享内存

共享内存
共享内存是进程间通信方式中效率最高的一种,因为进程可以对内存进行直接读写,而没有复制等其他操作,共享内存在内核中被创建,用时映射在用户空间,在用户空间操作。由于多个进程可同时访问共享内存,因此需要同步和互斥机制配合使用
一、函数接口
申请key值,除创建共享内存以外的进程需要通过key值来获得内存的ID值,当key值为IPC_PRIVATE(0)时,共享内存为私有,只有当前进程可以访问。
1、key_t ftok(const char *path, int proj_id);

成功时返回合法的key值,失败时返回EOF
path  存在且可访问的文件的路径
proj_id  用于生成key的数字,不能为0

2、 创建或者打开一个共享内存
int shmget(key_t key, int size, int shmflg);

成功时返回共享内存的id,失败时返回EOF
key  和共享内存关联的key,IPC_PRIVATE 或 ftok生成
shmflg 共享内存标志位  IPC_CREAT|0666

3、共享内存映射
void *shmat(int shmid, const void *shmaddr, int shmflg);

成功时返回映射后的地址,失败时返回(void *)-1
shmid   要映射的共享内存id
shmaddr   映射后的地址, NULL表示由系统自动映射
shmflg   标志位  0表示可读写;SHM_RDONLY表示只读

4、取消映射
int shmdt(void *shmaddr);

成功时返回0,失败时返回EOF
不使用共享内存时应撤销映射
进程结束时自动撤销

5、共享内存控制
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

成功时返回0,失败时返回EOF
shmid   要操作的共享内存的id
cmd   要执行的操作  IPC_STAT  IPC_SET  IPC_RMID
buf   保存或设置共享内存属性的地址

IPC_STAT为获取共享内存的属性,如内存的大小,关联的ley值等
IPC_RMID为删除共享内存,此时函数第三个函数为NULL
二、查看IPC对象的命令
1、ipcs
查看共享信息的内存的命令,默认会列出共享内存、信号量,队列信息,-m列出共享内存,-s列出共享信号量,-q列出共享队列; ipcs -a查看所有的IPC对象使用情况
2、ipcrm 删除一个IPC对象
在这里插入图片描述
ipcrm -m id 删除共享内存
ipcem -s id 删除信号量
ipcrm -q id 删除消息队列
三、注意
通过ipcs -l可知如下,共享内存最大个数为4096个,每个最大为32k,…
在这里插入图片描述
共享内存删除的时间点
shmctl(shmid, IPC_RMID, NULL) 添加删除标记
当所有进程映射取消且共享内存被添加删除标记,共享内存才会被真正删除。
nattach (进程取消映射的值)变成0时真正删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值