成品网站源码分享1688免费下载,成品网站代码下载

老铁们,大家好,相信还有很多朋友对于成品网站源码分享1688免费下载和成品网站代码下载的相关问题不太懂,没关系,今天就由我来为大家分享分享成品网站源码分享1688免费下载以及成品网站代码下载的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

内存映射文件技术概述

内存映射文件,是由一个文件到一块内存的映射。Win32提供了允许应用程序把文件映射到一个进程的函数(CreateFileMapping)。内存映射文件与虚拟内存有些类似,通过内存映射文件可以保留一个地址空间的区域,同时将物理存储器提交给此区域,内存文件映射的物理存储器来自一个已经存在于磁盘上的文件,而且在对该文件进行操作之前必须首先对文件进行映射。使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作,使得内存映射文件在处理大数据量的文件时能起到相当重要的作用。

Win32系统允许多个进程(运行在同一计算机上)使用内存映射文件来共享数据,所以,如果一个进程往内存映射文件中写数据,另一个进程来读,就实现了它们之间的通信。实际上,其他共享和传送数据的技术,诸如使用SendMessage或者PostMessage,都在内部使用了内存映射文件。

实现

接下来我们通过C语言编写程序,实现两个进程交换数据(通信)。在本例中,只在同一台主机上实现不同进程间的通信,所以可以使用内存映射文件来实现。

程序基本流程:

1)新建命名共享

首先利用CreateFile或者CreateFileForMapping获得一个用于映射的物理文件句柄,然后利用该文件句柄结合CreateFileMapping得到一个命名的共享内存映射文件句柄。

2)打开命名共享内存

如果需要共享已经存在的命名共享内存映射文件,使用OpenFileMapping函数。

3)获得地址空间指针

进行内存映射文件的读写和一般的文件读写不同,是直接面对你申请的地址空间,为此需要使用MapViewOfFile得到相关的地址LPVOID类型的指针。如果需要进行数据写入,可以通过类型转换直接对于内存地址进行赋值,比如memcpy(lpAddress,lpBuf,….);如果是读取操作,将参数顺序调整一下就可以了。

4)将内存复制到所映射的物理文件上面

FlushMapViewOfFile函数可以将内存里面的内容DUMP到物理磁盘上面。

5)卸载内存映射文件地址指针

UnmapViewOffFile函数来卸内存映射文件。

6)关闭内存映射文件

最后,调用CloseHandle来关闭内存映射文件。

实现及测试源代码

两个进程一个视为客户端,另一个视为服务端

cilentProcess:

include”math.h”

include”windows.h”

include”stdio.h”

voidmain()

{

//创建文件内核对象,其句柄保存于hFile

HANDLEhFile=CreateFile(“Recv1.zip”,

GENERIC_WRITE|GENERIC_READ,

FILE_SHARE_READ,

NULL,

CREATE_ALWAYS,

FILE_FLAG_SEQUENTIAL_SCAN,

NULL);

//创建文件映射内核对象,句柄保存于hFileMapping

HANDLEhFileMapping=CreateFileMapping(hFile,NULL,PAGE_READWRITE,

0,0×4000000,”ClientProcess”);

if(hFileMapping!=NULL&&GetLastError()==ERROR_ALREADY_EXISTS)

{

CloseHandle(hFileMapping);

hFileMapping=NULL;

return;

}

//设定大小、偏移量等参数

SYSTEM_INFOsinf;

GetSystemInfo(&sinf);

__int64qwFileSize=0x4000000;

__int64qwFileOffset=0;

__int64T=600*sinf.dwAllocationGranularity;

DWORDdwBytesInBlock=1000*sinf.dwAllocationGranularity;

//将文件数据映射到进程的地址空间

PBYTEpbFile=(PBYTE)MapViewOfFile(hFileMapping,

FILE_MAP_ALL_ACCESS,

(DWORD)(qwFileOffset>>32),(DWORD)(qwFileOffset&0xFFFFFFFF),dwBytesInBlock);

//测试程序

//从客户端读入一个数字,在服务端计算该数的平方,并将结果返回给客户端;

intdataInServerPro;

intflag=0;

memset(pbFile,0,sizeof(int));

FlushViewOfFile(pbFile,NULL);

while(1)

{

memcpy(&flag,pbFile,sizeof(int));

if(flag)

{

memcpy(&dataInServerPro,pbFile+sizeof(int),sizeof(int));

printf(“**********InServerProcess**********\\nReadanumfromClintProcess:\\t%d\\n”,dataInServerPro);

dataInServerPro=dataInServerPro*dataInServerPro;

memcpy(pbFile+sizeof(int),&dataInServerPro,sizeof(int));

FlushViewOfFile(pbFile,NULL);

memset(pbFile,0,sizeof(int));

FlushViewOfFile(pbFile,NULL);

}

Sleep(1);

}

//将文件数据从进程的地址空间中释放

UnmapViewOfFile(pbFile);

//释放文件映射内核对象

CloseHandle(hFileMapping);

//释放文件内核对象

CloseHandle(hFile);

}

运行结果

END,本文到此结束,如果可以帮助到大家,还望关注本站哦!

Published by

风君子

独自遨游何稽首 揭天掀地慰生平