linux c多进程通信之共享内存和信号量

编译环境: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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值