记linux下共享内存的学习(二)之对共享内存的封装

本文记录了将Linux共享内存封装为C++类的过程,并通过测试代码展示了成功实现多进程间通信及互斥访问。封装后的共享内存使用简洁高效。
摘要由CSDN通过智能技术生成

在学习了共享内存函数的使用方法以及使用信号量来确保不同进程间对共享内存操作时的互斥性后,这一次开始学习将共享内存封装成c++类的形式,方便以后的项目过程中可以直接使用它。

下面展示的是共享内存的头文件

#ifndef _SHM_FIFO_H_
#define _SHM_FIFO_H_

#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/shm.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <semaphore.h>

typedef struct shmhead_st
{
	int shmid;					// 共享内存ID
	unsigned int blksize;		// 块大小
	unsigned int blocks;		// 总块数
	unsigned int rd_index;		// 读索引
	unsigned int wr_index;		// 写索引

	//信号量必须放在共享内存头部才行
	sem_t sem_mutex;			// 用来互斥用的信号量
	sem_t sem_full;				// 用来控制共享内存是否满的信号量
	sem_t sem_empty;			// 用来控制共享内存是否空的信号量

}shmhead_t;

class CShmFIFO 
{
public:
	CShmFIFO(int key, int blksize, int blocks);
	CShmFIFO();
	~CShmFIFO();

	//创建和销毁
	bool init(int key, int blksize, int blocks);
	void destroy(void);
	static void Destroy(int key); //静态删除共享内存方法

	// 打开和关闭
	bool open(int key, int blksize, int blocks);
	void close(void);

	//读取和存储
	void write(const void *buf);
	void read(void *buf);
protected:
	//进程控制信息块
	bool m_open;
	void *m_shmhead;		// 共享内存头部指针
	char *m_payload;			// 有效负载的起始地址
};


#endif /* _SHM_FIFO_H_ */

下面是cpp文件

#include "ShmFIFO.h"

#define ERR_EXIT(m) \
    do { \
            perror(m); \
			fprintf(stderr, "Err: (%s:%s:%d)", __FILE__, __func__, __LINE__); \
            exit(EXIT_FAILURE); \
    } while(0)



CShmFIFO::CShmFIFO(int key, int blksize, int blocks)
{
	th
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值