Linux共享内存

31 篇文章 0 订阅
#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);
当对共享内存的操作结束时,则调用此函数脱接该段


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值