在Windows系统中,实现不同进程间内存共享的方法通常涉及使用命名内存映射文件(Named Memory-Mapped Files)或者Windows的API来创建共享内存区域。以下是使用命名内存映射文件实现进程间内存共享的一个简单示例:
使用命名内存映射文件
创建共享内存的进程(Writer.cpp)
#include <iostream>
#include <fstream>
#include <windows.h>
int main() {
const char* sharedMemoryName = "Global\\MySharedMemory";
const size_t sharedMemorySize = 1024; // 1KB
HANDLE hMapFile = CreateFileMappingA(
INVALID_HANDLE_VALUE, // 使用分页文件
NULL, // 默认安全属性
PAGE_READWRITE, // 读写权限
0, // 高32位文件大小
sharedMemorySize, // 低32位文件大小
sharedMemoryName // 共享内存名称
);
if (hMapFile == NULL) {
std::cerr << "CreateFileMapping failed with error: " << GetLastError() << std::endl;
return 1;
}
// 将文件映射对象映射到进程的地址空间
char* pMapAddress = static_cast<char*>(MapViewOfFile(
hMapFile, // 文件映射对象的句柄
FILE_MAP_ALL_ACCESS, // 读写权限
0, // 偏移高32位
0, // 偏移低32位
0 // 映射整个文件
));
if (pMapAddress == NULL) {
std::cerr << "MapViewOfFile failed with error: " << GetLastError() << std::endl;
CloseHandle(hMapFile);
return 1;
}
// 写入数据到共享内存
std::strcpy(pMapAddress, "Hello from shared memory!");
// 保持程序运行,以便其他进程可以读取数据
std::cout << "Data written to shared memory. Press Enter to continue..." << std::endl;
std::cin.get();
// 解除映射
if (!UnmapViewOfFile(pMapAddress)) {
std::cerr << "UnmapViewOfFile failed with error: " << GetLastError() << std::endl;
}
// 关闭文件映射对象句柄
CloseHandle(hMapFile);
return 0;
}
读取共享内存的进程(Reader.cpp)
#include <iostream>
#include <windows.h>
int main() {
const char* sharedMemoryName = "Global\\MySharedMemory";
HANDLE hMapFile = OpenFileMappingA(
FILE_MAP_ALL_ACCESS, // 读写权限
FALSE, // 不继承句柄
sharedMemoryName // 共享内存名称
);
if (hMapFile == NULL) {
std::cerr << "OpenFileMapping failed with error: " << GetLastError() << std::endl;
return 1;
}
// 将文件映射对象映射到进程的地址空间
char* pMapAddress = static_cast<char*>(MapViewOfFile(
hMapFile, // 文件映射对象的句柄
FILE_MAP_ALL_ACCESS, // 读写权限
0, // 偏移高32位
0, // 偏移低32位
0 // 映射整个文件
));
if (pMapAddress == NULL) {
std::cerr << "MapViewOfFile failed with error: " << GetLastError() << std::endl;
CloseHandle(hMapFile);
return 1;
}
// 从共享内存读取数据
std::cout << "Data from shared memory: " << pMapAddress << std::endl;
// 解除映射
if (!UnmapViewOfFile(pMapAddress)) {
std::cerr << "UnmapViewOfFile failed with error: " << GetLastError() << std::endl;
}
// 关闭文件映射对象句柄
CloseHandle(hMapFile);
return 0;
}
在上面的示例中,Writer.cpp
创建了一个命名内存映射文件,并向其中写入了一个字符串。Reader.cpp
则打开了这个命名内存映射文件,并读取了其中的数据。
请注意,在Windows上创建全局命名的共享对象(如共享内存、信号量、互