一、学习的知识点
共享内存的作用:
- 进程间传递数据
- 数据量多时 起缓冲作用 应设计为先进先出
共享内存的设计
头部信息放到共享内存中 是为了方便 另一个进程 对 共享内存中数据的读写
共享内存 的头部信息
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);
}
}
二、上课没有听懂或者没有理解的地方
无