Win32 - 进程间通信(IPC)共享内存
在 Windows 系统中,共享内存通过 文件映射对象(File Mapping Object) 实现。
核心思想是:
- 由一个进程创建一个 命名的内存映射文件;
- 其他进程通过该名称 打开同一个映射对象;
- 通过 MapViewOfFile() 函数把这段共享区域映射到自己进程的虚拟地址空间;
- 各进程即可读写同一段内存,实现数据共享。
示例代码:
服务端:
#include <iostream>
#include <Windows.h>
using namespace std;
#define BUF_SIZE 1024
int main()
{
// 要共享的数据
char szBuffer[] = "C/C++";
// 1. 创建共享文件映射对象
HANDLE hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用系统分页文件
NULL, // 默认安全属性
PAGE_READWRITE, // 可读可写
0, // 高32位文件大小
BUF_SIZE, // 共享内存大小
L"LSEDU" // 共享内存名称(标识)
);
if (hMapFile == NULL)
{
cout << "创建共享内存失败!错误码:" << GetLastError() << endl;
return 0;
}
// 2. 映射到当前进程的地址空间
LPVOID lpBase = MapViewOfFile(
hMapFile, // 映射对象句柄
FILE_MAP_ALL_ACCESS, // 读写权限
0, 0, BUF_SIZE
);
if (lpBase == NULL)
{
cout << "映射内存失败!错误码:" << GetLastError() << endl;
CloseHandle(hMapFile);
return 0;
}
// 3. 向共享内存写入数据
strcpy((char*)lpBase, szBuffer);
cout << "\n服务器程序端: " << (char*)lpBase << endl << endl;
// 挂起等待客户端读取数据
Sleep(20000);
// 4. 释放资源
UnmapViewOfFile(lpBase);
CloseHandle(hMapFile);
return 0;
}
客户端:
#include <iostream>
#include <Windows.h>
using namespace std;
#define BUF_SIZE 1024
int main()
{
// 1. 打开已存在的共享内存对象
HANDLE hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // 访问权限
FALSE, // 不继承句柄
L"LSEDU" // 必须与服务端名称一致
);
if (hMapFile == NULL)
{
cout << "打开共享内存失败,请检查服务器是否启动。" << endl;
return 0;
}
// 2. 映射到当前进程地址空间
LPVOID lpBase = MapViewOfFile(
hMapFile,
FILE_MAP_ALL_ACCESS,
0, 0, BUF_SIZE
);
if (lpBase == NULL)
{
cout << "映射失败!错误码:" << GetLastError() << endl;
CloseHandle(hMapFile);
return 0;
}
// 3. 从共享内存中读取数据
char szBuffer[BUF_SIZE] = { 0 };
strcpy(szBuffer, (char*)lpBase);
cout << "\n客户端程序端: " << szBuffer << endl << endl;
// 4. 释放资源
UnmapViewOfFile(lpBase);
CloseHandle(hMapFile);
return 0;
}
运行结果:


浙公网安备 33010602011771号