linux下共享内存小结

1.共享内存的概念:
一个进程不能简单的将自己的内存空间地址传递给其他进程使用,因为linux操作系统的内存保护机制或者内存映射机制的限制。
在一个进程内,指向一块内存的指针实际上是虚拟地址,而不是真正的物理内存地址,这个地址仅仅在当前进程内才是有效使用的。
如果通过某种方式,实现多个进程访问一块物理内存,那么进程之间的数据交换就可以通过读写内存来进行,这样的通信方式具有更高的效率。
所以我们常说,共享内存时一种最为高效的进程间通信方式。
注意:共享内存的方式并未提供同步机制,所以我们必须要负责实现共享内存的同步控制。
2.共享内存的使用:
(1)调用shmget函数,创建共享内存
(2)映射共享内存,使用shmat函数
(3)使用完毕后,撤销映射,使用函数shmdt。
3.shmget函数:
使用shmet函数来创建共享内存:
#include <sys/types.h>
#inlcude <sys/ipc.h>
#inlcude <sys/shm.h>
int shmget(key_t key,size_t size,int shmflg);
参数key,是一个键值,多个进程可以由这个键值访问同一个共享内存。当指定特殊值,IPC_PRIVATE,说明创建了只有当前进程可以访问的共享内存。
shmget函数返回一个共享内存标识符,用于后续的共享内存函数。
参数size的大小指定了这块共享内存的大小。
shmflg作用与创建文件时设定的权限标志mode一样。
4.shmat函数
第一次创建共享内存段时,它不可以被任何进程访问,要想启用对该内存的访问,必须将其连接到一个进程的地址空间内。
#include <sys/types.h>
#inlcude <sys/shm.h>
#include <sys/ipc.h>
void *shmat(int shmid,const void *shmaddr,int shmflg);
shmid是先前创建共享内存发回的内存标识符。
shmaddr指定共享内存连接到当前进程中的地址位置,它通常设为0,由系统来选择共享内存所出现的最佳地址。
shmflg是一组位标志。(设定SHM_RDONLY,表示共享内存只读。默认0.表示共享内存可读可写。)
若shmat调用成功,则它返回一个指向共享内存的第一个字节的指针。即被映射的段地址。
5.shmdt函数
其作用是将共享内存从当前进程中分离.
#include <sys/types.h>
#inlcude <sys/shm.h>
int shmat(const void *shmaddr);
参数shmaddr是shmat返回的指针。
将共享内存分离斌不是删除它,只是使得该共享内存对于当前的进程不再可用了。
5.shmctl函数
#inlcude <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid,int cmd,struct shmid_ds *buf);
shmid是shmget返回的内存共享标志符。
cmd是需要采取的动作:
(1)IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值
(2)IPC_SET:如果有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值。
(3)IPC_RMID:删除共享内存段
buf是一个指针,它指向包含共享内存模式和访问权限的结构。


例子参看代码类。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShaYQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值