内存共享
内存共享使用到的函数有以下5个:
- CreateFileMapping 创建
- OpenFileMapping 打开
- MapViewOfFile和UnmapViewOfFile 映射挂载卸载,用于读写操作
- CloseHandle 关闭
[1]. 被共享方
被共享方即创建者,通过创建共享内存和写入数据供其它程序使用。
#include <windows.h>
#define BUF_SIZE 256
#define SharedName TEXT("Global\\FileMappingObject")
int main()
{
/* 简化逻辑,不做异常处理 */
//1.创建共享内存文件
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
SharedName); // name of mapping object
//2.读写共享内存
LPTSTR pBuf = (LPTSTR)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
CopyMemory((PVOID)pBuf, TEXT("Hi, I'm Frist Process!"), 22 * sizeof(TCHAR));
UnmapViewOfFile(pBuf);
system("pause");//关闭句柄或应用退出共享内存失效
//3.关闭共享内存
CloseHandle(hMapFile);
return 0;
}
[2]. 共享方
共享方即使用者,通过打开共享内存来读出数据进行使用。
#include <windows.h>
#define BUF_SIZE 256
#define SharedName TEXT("Global\\FileMappingObject")
int main()
{
/* 简化逻辑,不做异常处理 */
//1.打开共享内存文件
HANDLE hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
SharedName); // name of mapping object
//2.读写共享内存
LPTSTR pBuf = (LPTSTR)MapViewOfFile(
hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
MessageBox(NULL, pBuf, TEXT("Second Process"), MB_OK);
UnmapViewOfFile(pBuf);
//3.关闭共享内存
CloseHandle(hMapFile);
return 0;
}
总结
共享内存是进程间通信的一种方式,使用的是内存映射的文件(memory-mapped files),其操作和文件的操作十分类似,但有一点需要注意,共享内存需要管理员权限,否则会发送创建失败等情况。