编译环境:Ubuntu16.04 64位
交叉编译工具:arm-hisiv500-linux-gcc
1. 项目背景
最近项目中需要用到共享内存的交互,取走旧数据,取数据不及时写入覆盖旧数据,队列长度可配置,自己造个轮子吧,对照下一篇linux c多线程简单队列实现。
2. 涉及的函数
详细描述可以百度或ubuntu下查询man手册。
共享内存相关:
int shmget(key_t key, size_t size, int shmflg);
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmctl(int shmid, int cmd, struct shmid_ds *buf);
信号量相关:
int semget(key_t key,int nsems,int semflg);
int semctl(int semid,int semnum,int cmd, /union semun arg/);
semctl是可变参数长度的函数
int semop(int semid, struct sembuf *sops, size_t nsops);
3. 头文件JShm.h
#ifndef __J_SHM__
#define __J_SHM__
#ifdef __cplusplus
extern "C" {
#endif
typedef enum _JShm_ERR{
JSHM_NO_DATA = -4, // 无数据供读取
JSHM_READ_LENGTH_ERR = -3, // 读取缓冲区长度不够
JSHM_WRITE_LENGTH_ERR = -2, // 写入共享内存长度超出
JSHM_INIT_FAIL = -1, // 初始化异常
JSHM_OK = 0,
JSHM_WRITE_OVERWRITE = 1, // 写成功,但是覆盖
}JShm_ERR;
class JShm {
public:
JShm(int key, unsigned int size, unsigned int blockNum = 0);
~JShm();
int Write(unsigned char *buf, unsigned int len);
int Read(unsigned char *buf, unsigned int len);
private:
int Init();
int UnInit();
int SemP();
int Se