缓冲区设计—进程间通讯(POSIX 共享内存)

时间:2022-12-06 12:19:09

在《缓冲区设计-线程间通讯 》一文中,完成了BufQueue的模版类的设计。这个模版类定义如下:

template< typename _Tp, typename Alloc = BufQueue_allocate<_Tp> >
class BufQueue;

 

其中的模版参数Alloc可以订制为不同的环冲内存形式。在线程间的通讯中,这个参数当然是最简单的,它只要简单的分配空间就可以了,因为同一进程中的线程是共享进程的内存空间的。

 

但是,如果要在进程间使用这个环形缓冲区,则需要使用共享内存的机制了。只所以将BufQueue设计成有Alloc这样一个模版参数,也正是为了这样的目的的。这一篇里,我们将实现这个目标,也就是要写一个使用共享内存的Alloc。

 

这里使用POSIX共享内存的接口来实现。

POSIX共享内存主要接口为:使用shm_open打开或创建一个共享内存区,然后使用mmap将这个共享内存区影射到进程的内存空间中。

这两个接口的定义如下:

int shm_open(const char *name, int oflag, mode_t mode);
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

 

详细的POSIX共享内存的调用和接口说明,请参考有关的资料。

 

以下是源程序:

 

 

下面的程序是测试程序,也可称为使用示例程序。

 

 

程序的14行到19行对应的是使用本篇文章介绍的使用POSIX共享内存的缓冲区类型。而21行到26行使用的是Alloc模版参数为 xtl::BufQueShmAlloc,这是使用System V的共享内存实现的模版类(将在下一篇中给出实现的代码)。为了使用我们本篇的POSIX共享内存类,我们需要在上面的程序的16行之前增加一行:

# define PSHM

 

51行到64行之间为子进程,不断地读出队列数据。

73行到74行的循环里,是父进程向缓冲队列内写数据。