共享内存(进程间通信)

目录

为什么要有共享内存?

 查看、删除共享内存

关于共享内存的有关函数

附本文思维导图


为什么要有共享内存?

        共享内存是进程间通信方法中最快的一种,因为它不需要调用系统接口,直接在内存级进行操作,不涉及内核

它存在于内存的共享区:


 

 查看、删除共享内存

 【查看创建的共享内存

ipcs -m

删除共享内存

ipcrm -m [shmid]

 

关于共享内存的有关函数


shmget

int shmget(size_t key,size_t size, int shmflg)

目的是用来创建一个共享内存以供使用,返回值是int,key代表这个共享内存段的名字,一般用ftok生成,size为此共享内存的大小(必须为页的整数倍)shmflg是打开的形式

1.ftok:通过一个存在的文件名和自己在0-255中选择的8bit整数,生成一个唯一的key,作为共享内存的中间标识

2.页:一个页是4KB,也就是4096字节

3.shmflg中,未存在的可以使用IPC_CREAT | IPC_EXCL,已存在的可以使用IPC_CREAT或者传0


shmmat

void *shmat(int shmid, const void *shmaddr, int shmflg)

目的是将共享内存挂接到进程地址空间中,返回值是void*   shmid是指在shmget中生成的id,shmaddr为共享内存挂接的地址,shmflg也是挂接方式

1.关于返回值:如果成功则返回共享存储段的指针(虚拟地址),并且内核将使其与该共享存储段相关的shmid_ds结构中的shm_nattch计数器加1(类似于引用计数)

2.shmaddr:一般为0,及内核可以选择的第一个地址上(一般为这个进程自己

3.shmflg:如果指定了SHM_RDONLY,则以只读方式打开此段,否则以读写方式打开


shmdt

int shmdt(const void *shmaddr);

起到去关联的作用(即取消共享内存与进程间的关联),返回值在函数成功时返回0,否则返回-1,内部的shmaddr指关联时返回的那个虚拟地址,需要指定了才能去关联


shmctl

int shmctl(int shmid, int cmd, struct shmid_ds *buf)

用于共享内存的控制(可以用来删除),成功时返回0,失败返回-1,shmid是shmget时返回的id值,cmd是用于控制共享内存的命令,buf则置为NULL即可

1.cmd种类:IPC_STAT(把shmid_ds结构中的数据设置为共享内存的当前关联值)、IPC_SET(在进程有足够的权限下,把共享内存的当前关联值设置为shmid_ds结构中给出的值)、IPC_RMID(删除共享内存段)

2.shmid_ds* buf:是一个指向一个保存着共享内存模式状态和访问权限的数据结构


附本文思维导图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值