进程间通讯——内存映射/文件映射形式

时间:2021-05-28 10:15:35

内存映射/文件映射形式下的进程交通讯不分32位还是64位,是因为本质上使用的是系统物理页面(系统位数)。

主要是三个函数:CreateFileMapping;MapViewOfFile(映射内存),OpenFileMapping。

// FileSend.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>

#include<Windows.h>

int main()
{
HANDLE MappingHandle = NULL;
PVOID BaseAddres = NULL;

MappingHandle=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,0X1000,L"HelloWorld");
if (MappingHandle == NULL)
{
return 0;
}

BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS,0, 0, 0);


__try
{
memcpy(BaseAddres, "HelloClient", strlen("HelloClient") + 1);
printf("%s\r\n", BaseAddres);
printf("Input AnyKey To Continue\r\n");
getchar();
printf("%s\r\n", BaseAddres);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("异常\r\n");
goto Exit;
}








Exit:
if (MappingHandle != NULL)
{
CloseHandle(MappingHandle);
MappingHandle = NULL;
}

printf("Input AnyKey To Exit\r\n");
getchar();
return 0;
}







// FileRecv.cpp : 定义控制台应用程序的入口点。
//

#include <stdio.h>
#include<windows.h>

int main()
{
HANDLE MappingHandle = NULL;
PVOID BaseAddres = NULL;
MappingHandle = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"HelloWorld");
if (MappingHandle == NULL)
{
return 0;
}



BaseAddres = MapViewOfFile(MappingHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);


__try
{
printf("%s\r\n", BaseAddres);
memcpy(BaseAddres, "HelloServer", strlen("HelloServer") + 1);


}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("异常\r\n");
goto Exit;
}


Exit:
if (MappingHandle != NULL)
{
CloseHandle(MappingHandle);
MappingHandle = NULL;
}
printf("Input AnyKey To Exit\r\n");
getchar();
return 0;
}



Send:创建句柄-映射虚拟内存-将“HelloClient”写入虚拟内存-等待-读虚拟内存
Recv:打开句柄-映射虚拟内存-读虚拟内存-将“HelloServer”写入虚拟内存-等待

(运行的时候先启动Send再Recv)。


遇到的问题:

1.内存映射的方式较简单,主要就是三个函数的使用问题。