栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C++面试题】共享内存

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C++面试题】共享内存

#ifndef _SHAREMEM_API_H_
#define _SHAREMEM_API_H_
#include "Type.h"


#ifdef	__WINDOWS__
#define INVALID_SM_HANDLE	 ((VOID*)0)
#elif	 __LINUX__
#define INVALID_SM_HANDLE	 -1
#endif


namespace	ShareMemAPI
{

	
	SMHandle		CreateShareMem(SM_KEY key,UINT Size);
	
	SMHandle		OpenShareMem(SM_KEY key,UINT Size);
	
	
	CHAR*			MapShareMem(SMHandle handle);
	
		
	VOID			UnMapShareMem(CHAR* MemoryPtr);
	
	
	VOID			CloseShareMem(SMHandle handle);


}


#endif

#include "baseHead.h"

#include "ShareMemAPI.h"

#if __LINUX__
#include  
#include  
#include  
#include 
#elif __WINDOWS__
#include 
#endif

namespace ShareMemAPI
{


SMHandle		CreateShareMem(SM_KEY key,UINT Size)
{
	__ENTER_FUNCTION
	//CHAR keybuf[64];
	//memset(keybuf,0,64);
	//sprintf(keybuf,"./%d",key);
#if __LINUX__
	//key = ftok(keybuf,'w'); 
	SMHandle hd =  shmget(key ,Size,IPC_CREAT|IPC_EXCL|0666); 
	printf("handle = %d ,key = %d ,CreateShareMem error: %d rn",hd,key,errno);
	return hd;
#elif __WINDOWS__
	CHAR keybuf[64];
	memset(keybuf,0,64);
	sprintf(keybuf,"%d",key);
	return  CreateFileMapping( (HANDLE)0xFFFFFFFFFFFFFFFF, NULL, PAGE_READWRITE, 0, Size, keybuf);
#endif
	__LEAVE_FUNCTION
	return SMHandle(-1);

}

SMHandle		OpenShareMem(SM_KEY key,UINT Size)
{
	__ENTER_FUNCTION
	//CHAR keybuf[64];
	//memset(keybuf,0,64);
	//sprintf(keybuf,"./%d",key);
#if __LINUX__
	//key = ftok(keybuf,'w'); 
	SMHandle hd =   shmget(key , Size,0);
	printf("handle = %d ,key = %d ,OpenShareMem error: %d rn",hd,key,errno);
	return hd;
#elif __WINDOWS__

// 	SECURITY_ATTRIBUTES sa;  
// 	SECURITY_DESCRIPTOR sd;  
// 
// 	InitializeSecurityDescriptor(&sd,SECURITY_DESCRIPTOR_REVISION);  
// 	SetSecurityDescriptorDacl(&sd,TRUE,NULL,FALSE);  
// 	sa.nLength = sizeof(SECURITY_ATTRIBUTES);  
// 	sa.lpSecurityDescriptor = &sd,  
// 	sa.bInheritHandle = FALSE;

	CHAR keybuf[64];
	memset(keybuf,0,64);
	sprintf(keybuf,"%d",key);
	return OpenFileMapping( FILE_MAP_ALL_ACCESS, TRUE, keybuf);
#endif
	__LEAVE_FUNCTION
		return SMHandle(-1);}

CHAR*			MapShareMem(SMHandle handle)
{
	__ENTER_FUNCTION

#if __LINUX__
	return  (CHAR*)shmat(handle,0,0);
#elif __WINDOWS__
	return (CHAR *)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
#endif
	__LEAVE_FUNCTION
		return 0;

}


VOID			UnMapShareMem(CHAR* MemoryPtr)
{
	__ENTER_FUNCTION
#if __LINUX__
	  shmdt(MemoryPtr);
#elif __WINDOWS__
	 UnmapViewOfFile(MemoryPtr);
#endif
	__LEAVE_FUNCTION
}


VOID			CloseShareMem(SMHandle handle)
{
	__ENTER_FUNCTION
#if __LINUX__
	shmctl(handle,IPC_RMID,0); 
#elif __WINDOWS__
	CloseHandle(handle);
#endif
	__LEAVE_FUNCTION
}

}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012005.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号