資源簡介
將共享內存操作封裝成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)
評論
共有 條評論