windows linux 的内存映射文件写法

show me the code

#include <stdio.h>
#include <stdint.h>

#ifdef _WIN32
#include <Windows.h>
class cmem_map
{
	HANDLE hFile = NULL;
	OFSTRUCT opBuf;
	HANDLE hMapfile = NULL;
	HANDLE hMapview = NULL;
	long offset = 0;
public:
	cmem_map() {}
	~cmem_map() {}

	bool IsOpen()
	{
		return (hMapview != NULL);
	}
	bool IsClosed()
	{
		return (hMapfile == NULL);
	}
	int Open(const wchar_t * memfile_add, int fsize)
	{
		hFile = ::CreateFile(memfile_add, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
		if (hFile == 0)
		{
			printf("open file failed!\n");
			return -1;
		}

		//2.为指定文件创建一个有名的文件映象
		hMapfile = CreateFileMapping((HANDLE)hFile, NULL, PAGE_READWRITE, 0, fsize, L"MapTest");
		if (hMapfile == NULL)
		{
			printf("mapping file failed!\n");
			return -1;
		}
		//关闭文件句柄
		CloseHandle((HANDLE)hFile);
		hFile = 0;
		hMapview = MapViewOfFile(hMapfile, FILE_MAP_WRITE, 0, 0, 0);
		if (hMapview == NULL)
		{
			printf("mapping view failed!\n");
			return -1;
		}
		return 0;
	}
	void Close()
	{
		UnmapViewOfFile(hMapview);
		//关闭文件映象句柄
		CloseHandle(hMapfile);
		hMapfile = 0;
	}
	long GetSize()
	{
		return offset;
	}
	int Write(uint8_t * data, int size)
	{
		char *recv = (char *)hMapview;
		recv += offset;
		memcpy(recv, data, size);
		offset += size;
		//把文件映射视图中的修改的内容或全部写回到磁盘文件中
		FlushViewOfFile(recv, size);
		return offset;
		//return 0;
	}
};

#endif  
#ifndef _WIN32
#include <fcntl.h>   
#include <unistd.h>   
#include <sys/mman.h>   



cmem_map::cmem_map() : m_pData(0), m_uSize(0), m_nFile(0)
{
}

cmem_map::~cmem_map()
{
	UnMap();
}

bool cmem_map::Map(const char* szFileName)
{
	UnMap();
	m_nFile = open(szFileName, O_RDONLY);
	if (m_nFile < 0)
	{
		m_nFile = 0;
		return false;
	}

	struct stat status;
	fstat(m_nFile, &status);

	m_uSize = status.st_size;
	m_pData = mmap(0, m_uSize, PROT_READ, MAP_SHARED, m_nFile, 0);
	if (MAP_FAILED != m_pData) { return true; }

	close(m_nFile);
	m_pData = NULL;
	m_nFile = 0;
	m_uSize = 0;
	return false;
}

void cmem_map::UnMap()
{
	if (m_pData)
	{
		munmap(m_pData, m_uSize);
		m_pData = NULL;
	}

	if (m_nFile)
	{
		close(m_nFile);
		m_nFile = 0;
	}

	m_uSize = 0;
}
#endif // !WIN32

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qianbo_insist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值