资源简介
将共享内存操作封装成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
- 上一篇:SED1520 C语言驱动程序
- 下一篇:D2D显示图片(MFC)
相关资源
- compat-libstdc++-33-3.2.3-69.el6.x86_64
- 实现端口扫描C++版
- 控制台flappy birdC++源码
- Poisson泊松分布的C++程序
- linux c语言写的坦克大战小游戏
- C++获取所有局域网可用IPping
- C++期末复习资料6套
- C++ 利用EasyX库绘制五子棋功能
- Linux下用c++调用自己的matlab函数的一个
- STK与VC++ 6.0联合编程
- VC++MFC串口调试助手完整编辑过程介绍
- 20C++MFC课程设计之吹泡泡游戏
- C++ 视频采集
- C++定义一个MyString类,实现两个字符串
- 学生签到管理系统C++版本
- VC++端口转发程序源码
- C++ 聊天软件源代码(内容加密RSA加密
- 即时通讯flamingo服务器端代码
- C++程序设计杨长兴、刘卫国答案
- NetCDF C++接口使用说明
- VC++操作WPS表格的类(VC6.0编译通过)
- TCP、UDP端口及ICMP网络扫描工具
- 基于C++的绘图软件
- C++数据结构分段线性插值
- RSA加解密源码VC++
- c++实现算术编码-数据压缩
- 视频字幕解析程序,C++
- 清华大学 郑莉 C++程序设计 习题答案
- 清华大学出版社C++程序设计 第三版习
- C++实现文件复制视频,图像,文本,
评论
共有 条评论