前面说了共享内存有一些缺陷,无法达到进程同步的效果,然而将共享内存和信号量集结合使用,再加上锁的概念,就可以达到同步的结果。具体实现如下:
头文件:shmfifo.h
#ifndef __SHMFIFO_H__
#define __SHMFIFO_H__
typedef struct shm_head{
int rd_idx; // 读位置
int wr_idx; // 写位置
int blocks; // 块数
int blksz; // 每块大小
} head_t;
typedef struct shmfifo {
head_t *p_head; // 共享内存段的头
char *p_payload; // 有效数据地址
int shmid; // 共享内存id
int sem_full; // 表示满
int sem_empty; // 表示还有几个可消费
int sem_mutex; // 互斥量
}shmfifo_t;
shmfifo_t* shmfifo_init(int key, int blocks, int blksz);
void shmfifo_put(shmfifo_t *fifo, const void *buf);
void shmfifo_get(shmfifo_t *fifo, void *buf);
void shmfifo_destroy(shmfifo_t *fifo);
#endif //__SHMFIFO_H__
其中,
shmfifo_t* shmfifo_init(int key, int blocks, int blksz);
shmfifo_init 是创建共享内存, 如果有,则初始化结构体中的成员,如果没有,则创建一块儿共享内存。