进程间通信—共享内存

共享内存

  • 共享内存是正在运行的进程之传递数据的一种非常有效的方式。大多数共享内存的具体实现,都把不同进程之间共享的内存安排为同一段物理内存。
  • 其他进程可以将同一段共享内存连接到他们自己的地址空间中。所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样。如果某个进程向共享内存写入了数据,所作的改动将立刻被可以访问同一段共享内存的任何其他进程看到。
  • 共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
  • 共享内存与其他的进程间通信最大的优点是:数据的复制只有两次,一次是从输入文件到共享内存区,一次从共享内存区到输出文件

其他的则是需要复制4次:服务器将输入文件读入自己的进程空间,再从自己的进程空间写入管道/消息队列等;客户进程从管道/消息队列中读出数据到自己的进程空间,最后输出到客户指定的文件中;

在这里插入图片描述

接口函数

#include<sys/shm.h>

/*
成功时返回一个指向共享内存的第一个字节的而指针,失败返回-1

第一次创建共享内存段时,它不能被任何进程访问。要想启用对该共享内存的访问,必须将其连接到一个进程的地址空间中。

shm_id:由shmget返回的共享内存标识符
shm_addr:指定的是共享内存连接到当前进程中的地址位置。通常是一个空指针,表示让系统来选择共享内存出现的地址

*/
void *shmat(int shm_id,const *shm_ddr,int shmflg);

/*
控制函数
command:
IPC_STAT
IPC_SET
IPC_RMID:删除共享内存段
*/
void shmctl(int shm_id,int cmd,struct shmid_ds *buf);

/*
将共享内存从当前进程中分离,注意:将共享内存分离并未删除它,只是使得该共享内存对当前进程不再可用
*/
int shmdt(const void *shm_addr);

/*
创建共享内存,成功返回一个非负整数(共享内存标识符),失败返回-1

key:为共享内存段命名
size:以字节为单位指定需要共享的内存容量
shmflg:由IPC_CREAT和权限标志按位或才能创建一个新的共享内存段
*/
int shmget(ket_t key,sizr_t size,int shmflg);

由于共享内存并未提供同步机制,所以我们通常需要用其他的机制来同步对共享内存的访问。

实现进程的同步

在这里插入图片描述
示例:生产者
在这里插入图片描述
b程序:消费者
在这里插入图片描述
通过ipcs -m查看共享内存,ipcm -m删除共享内存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值