210305设计共享内存

一、学习的知识点

共享内存的作用:

  1. 进程间传递数据
  2. 数据量多时 起缓冲作用 应设计为先进先出

共享内存的设计

头部信息放到共享内存中 是为了方便 另一个进程 对 共享内存中数据的读写
在这里插入图片描述

共享内存 的头部信息

typedef struct shmhead
{
	int blkssize;//每块多大
	int blocks;//一共有多少块
	int wr_index;//写到哪个位置
	int rd_index;//读到哪个位置
}SHMHEAD_T;

共享内存的属性

typedef struct shmfifo
{
	SHMHEAD_T* shm_head; //头部信息
	int shmkey;
	int shmid; //共享内存id
	int sem_mutex; //互斥锁
	int sem_full;// 生产者 最开始有多少个空位置(一共几块)
	int sem_empty; //消费者 最开始为0
	char* payload;//实际存数据的地址

}SHMFIFO_T;

共享内存类

class shmFIFO
{
public:
	shmFIFO(int key,int blksize,int blocks);
	void shmfifo_put(char* buf);
	void shmfifo_get(char* buf);

private:
	int key_;
	int blksize_;
	int blocks_;
	SHMFIFO_T* fifo;
};

共享内存类的构造函数

shmFIFO::shmFIFO(int key, int blksize, int blocks):key_(key),blksize_(blksize),blocks_(blocks)
{
	//初始化头部
	fifo = (SHMFIFO_T*)malloc(sizeof(SHMFIFO_T));
	memset(fifo, 0, sizeof(SHMFIFO_T));
	cout << sizeof(SHMFIFO_T) << endl;
	//创建共享内存 创建信号量
	fifo->shmid = shmget(key_, 0, 0); //打开这个key的共享内存

	int size = sizeof(SHMHEAD_T) + blksize_ * blocks_;
	if (fifo->shmid == -1) //打开失败
	{
		//表示这个共享内存之前没有被创建
		fifo->shmid = shmget(key_, size, IPC_CREAT | 0666);

		//共享内存挂载
		fifo->shm_head = (SHMHEAD_T*)shmat(fifo->shmid, NULL, 0);

		//实际存放数据的地址
		fifo->payload = (char*)(fifo->shm_head + 1); //偏移一个结构体

		//初始化头部结构体
		fifo->shm_head->rd_index = 0;
		fifo->shm_head->wr_index = 0;
		fifo->shm_head->blkssize = blksize_;
		fifo->shm_head->blocks = blocks_;

		//初始化生产者信号量  表示有 blocks_ 个单元可用
		fifo->sem_full = semget(key_, 1, IPC_CREAT | 0666);
		sem_setval(fifo->sem_full, blocks_);

		//初始化消费者信号量
		fifo->sem_empty = semget(key_+1, 1, IPC_CREAT | 0666);
		sem_setval(fifo->sem_empty, 0);
	}
}

二、上课没有听懂或者没有理解的地方

三、当天学习的收获

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值