#ifndef _SHARED_WSHM_H_
#define _SHARED_WSHM_H_
/**
*class CShm: 共享内存操作
*/
class CShm
{
public:
CShm();
CShm(const char* filename, unsigned int size);
~CShm();
void Open(const char* filename, unsigned int size);
void Close();
void* Attach(unsigned int offset, int flag);
void Detach();
private:
CShm(const CShm& shm);
CShm& operator=(const CShm& shm);
private:
int m_shmid;
void* m_shmem;
};
#endif // _SHARED_WSHM_H_
#include "wshm.h"
#include <iostream>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/stat.h>
#include <fcntl.h>
CShm::CShm()
: m_shmid(-1), m_shmem(NULL)
{
}
CShm::CShm(const char* filename, unsigned int size)
: m_shmid(-1), m_shmem(NULL)
{
Open(filename, size);
}
CShm::~CShm()
{
}
void CShm::Open(const char* filename, unsigned int size)
{
if (-1 == access(filename, F_OK))
{
creat(filename, S_IRWXU);
}
key_t key = ftok(filename, 0);
// 创建共享内存
m_shmid = shmget(key, size, IPC_CREAT | IPC_EXCL | 0666);
// 如果共享内存已创建就直接打开
if (errno == EEXIST)
{
m_shmid = shmget(key, size, 0666);
}
}
void CShm::Close()
{
if (-1 != m_shmid)
{
shmctl(m_shmid, IPC_RMID, 0);
m_shmid = -1;
}
}
void* CShm::Attach(unsigned int offset, int flag)
{
m_shmem = shmat(m_shmid, (const void*)offset, flag);
if ((void*)-1 == m_shmem)
{
m_shmem = NULL;
}
return m_shmem;
}
void CShm::Detach()
{
if (m_shmem)
{
shmdt(m_shmem);
m_shmem = NULL;
}
}
1.access(filename, F_OK);
检查文件是否存在
2.creat(filename, S_IRWXU);
创建一个拥有读、写、执行权限的文件
3.ftok(filename, 0);
系统建立IPC通讯(如消息队列、共享内存时)必须指定一个ID值,通常情况下,该id值通过ftok函数得到。
ftok原型如下:
key_t ftok( char * fname, int id )
fname就时你指定的文件名,id是子序号。
在一般的UNIX实现中,是将文件的索引节点号取出,前面加上子序号得到key_t的返回值。
如指定文件的索引节点号为65538,换算成16进制为0x010002,而你指定的ID值为38,换算成16进制为0x26,则最后的key_t返回值为0x26010002。
4.shmget(key, size, IPC_CREAT | IPC_EXCL | 0666);
分配共享内存,返回一个内存ID号
key:ftok的返回值;
size:空间大小;
IPC_CREAT创建,IPC_EXCL如果已创建确保IPC_CREAT失败,0666使用者可读写、同一组用户可读写、其它用户可读写
5.shmget(key, size, 0666)
如果共享内存已创建,直接返回内存ID
6.shmctl(m_shmid, IPC_RMID, 0);
销毁共享内存
7.shmat(m_shmid, (const void*)offset, flag);
将共享内存连接到进程的地址空间中
8.shmdt(m_shmem);
当对共享内存的操作结束时,则调用此函数脱接该段
Linux共享内存
最新推荐文章于 2024-03-29 17:30:27 发布