共享内存与信号量集结合使用的案例

前面说了共享内存有一些缺陷,无法达到进程同步的效果,然而将共享内存和信号量集结合使用,再加上锁的概念,就可以达到同步的结果。具体实现如下:

头文件: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 是创建共享内存, 如果有,则初始化结构体中的成员,如果没有,则创建一块儿共享内存。

参数:

        key,创建共享内存标识号。

        blocks,创建多少块。

        blksz,每一块的大小是多少。

返回值,共享内存的其实地址。


void shmfifo_put(shmfifo_t *fifo, const void *buf);

shmfifo_put是向共享内存中放数据。

参数:

        fifo,向哪一个信号量集中放数据。

        buf,要放的内容。

无返回值。


void shmfifo_get(shmfifo_t *fifo, void *buf);

shmfifo_get是从共享内存中的信号量集取数据。

参数:

        fifo,向哪一个信号量集中取数据。

        buf,取出来的数据存放的地方。

无返回值。


void shmfifo_destroy(shmfifo_t *fifo);

shmfifo_destroy是销毁共享内存以及信号量集

参数:

        fifo,要销毁的共享内存的指针。

无返回值。

具体实现代码请见:具体代码实现

猜你喜欢

转载自blog.csdn.net/zy20150613/article/details/80106636
今日推荐