在学习了共享内存函数的使用方法以及使用信号量来确保不同进程间对共享内存操作时的互斥性后,这一次开始学习将共享内存封装成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