• 大小: 7KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-06-07
  • 语言: C/C++
  • 标签: C++  共享内存  linux  

资源简介

将共享内存操作封装成C++类,通过信号灯semaphore进行进程同步。可以像操作普通缓冲区那样操作共享内存,实现进程间通信 编译时需要添加-lrt编译选项

资源截图

代码片段和文件信息

/*
 * File: atu_shm_buffer.cpp
 * Description: A shared memory buffer. Read/write a shared memory just like a normal buffer.
 * Use a semaphore with the same name to synchronize the shared memory buffer in multi-process.
 * Created on: 2012-9-18
 * Author: PArt
 * Any questions please mail me:) atu8292991@gmail.com
 */

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include “atu_shm_buffer.h“

namespace atu_libs {

namespace atu_shm_buffer {
/*
 *  Constructor of atu_shm_buffer.
 *  @name:     the name of the shared memory.
 *  @len:      if first created specify the length of the shared memroy.
 *  @create:   true create a new shared memory false link to an exist shared memory.
 */
atu_shm_buffer::atu_shm_buffer(const char *name size_t len bool create)
: m_buf(NULL)
 m_len(len)
 m_name(name)
{
assert(NULL != name);

int ret(0);

//link to the shared memory.
if (create)
{
m_fd = shm_open(name O_RDWR | O_CREAT 0644);

//create a semaphore for w/r operation.
m_sem = sem_open(name O_CREAT 0644 1);
if (SEM_FAILED == m_sem)
{
fprintf(stderr “Failed to create semaphore %s!\n“ name);
return;
}
//set the size of the shared memory.
ret = ftruncate(m_fd len);
if (-1 == ret)
{
fprintf(stderr “Failed to re-size shared memory buffer %s!\n“ name);
return;
}
}
else
{
m_fd = shm_open(name O_RDWR 0644);
//set a sem for w/r operation.
m_sem = sem_open(name O_RDWR);
if (SEM_FAILED == m_sem)
{
fprintf(stderr “Failed to create semaphore %s!\n“ name);
return;
}
}
if (-1 == m_fd)
{
fprintf(stderr “Failed to create shared memory buffer %s!\n“ name);
return;
}

//get shared memory status.
ret = fstat(m_fd &m_stat);
if (-1 == ret)
{
fprintf(stderr “Failed to get status of shared memory!\n“);
return;
}
m_len = m_stat.st_size;

//map the shared memory to buffer.
m_buf = mmap(NULL len PROT_READ | PROT_WRITE MAP_SHARED m_fd 0);
if (MAP_FAILED == m_buf)
{
perror(“Failed to map shared memory to process!“);
return;
}

//If the shared memory is created for the first time initialize it.
if (create)
{
memset(m_buf 0 len);
}
}

atu_shm_buffer::~atu_shm_buffer() {
if (-1 != m_fd)
{
munmap(m_buf m_len);
}

//!!!If you want to unlink semaphore and shared memory please use function unlink().
}

/*
 *  Unlink the shared memory and semaphore from linux kernel.
 */
void atu_shm_buffer::unlink(void)
{
if (MAP_FAILED != m_buf)
{
sem_unlink(m_name.c_str());
shm_unlink(m_name.c_str());
}
}

/*
 *  Read from shared memory. Use a semaphore with the same name to synchronize.
 *  @buf:    the point to a buffer the buffer must be allocated.
 *  @len:    the length of bytes read from shared memory.
 */
void atu_shm_buffer::read(char *buffer size_t len)
{
if (len > m_len)
{
fprintf(stderr “[read] Buffer is truncated! From %d to %d bytes.\n“
(int)len (int

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2012-09-19 11:57  atu_shm_buffer\
     文件       12243  2012-09-18 16:45  atu_shm_buffer\.cproject
     目录           0  2012-09-19 16:27  __MACOSX\
     目录           0  2012-09-19 16:27  __MACOSX\atu_shm_buffer\
     文件          82  2012-09-18 16:45  __MACOSX\atu_shm_buffer\._.cproject
     文件        6148  2012-09-19 11:57  atu_shm_buffer\.DS_Store
     文件          82  2012-09-19 11:57  __MACOSX\atu_shm_buffer\._.DS_Store
     文件         815  2012-09-18 16:21  atu_shm_buffer\.project
     文件          82  2012-09-18 16:21  __MACOSX\atu_shm_buffer\._.project
     文件        3609  2012-09-19 11:56  atu_shm_buffer\atu_shm_buffer.cpp
     文件        2017  2012-09-19 11:55  atu_shm_buffer\atu_shm_buffer.h
     文件        1229  2012-09-19 11:52  atu_shm_buffer\atu_shm_buffer_example.cpp

评论

共有 条评论