这个示例中,我们创建了一个 SharedData 结构体,其中包含一个整数 value 和一个字符数组 message。我们通过共享内存来在两个进程之间传递和共享这些数据。
首先,我们使用 CreateFileMapping 函数创建一个共享内存对象,并指定共享内存的大小为 bufferSize(即 SharedData 结构体的大小)。
然后,使用 MapViewOfFile 函数将共享内存映射到当前进程的地址空间,并将返回的指针 sharedData 转换为 SharedData* 类型,以便我们可以直接操作共享数据。
接下来,我们将一些数据写入共享内存,即修改 sharedData 中的 value 和 message。
在程序中适当的位置,我们等待用户按下 Enter 键,以便在第二个进程启动之前暂停。
在另一个进程中,我们可以使用相同的共享内存名称打开和映射共享内存,然后读取其中的数据。这样,我们可以在两个进程之间传递信息和共享数据。
这个示例演示了共享内存在进程间通信中的用处。通过共享内存,不同的进程可以共享数据,以实现高效的数据交换和通信。这在多个进程需要共享大量数据或频繁进行数据传递的情况下非常有用,可以提高程序的性能和效率。
#include <windows.h>
#include <iostream>
struct SharedData
{
int value;
char message[256];
};
int main()
{
const int bufferSize = sizeof(SharedData);
// 创建共享内存对象
HANDLE hSharedMemory = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
bufferSize,
L"MySharedMemory");
if (hSharedMemory == NULL)
{
std::cout << "无法创建共享内存对象!" << std::endl;
return 1;
}
// 将共享内存映射到当前进程的地址空间
SharedData* sharedData = static_cast<SharedData*>(MapViewOfFile(
hSharedMemory,
FILE_MAP_ALL_ACCESS,
0,
0,
bufferSize));
if (sharedData == NULL)
{
std::cout << "无法映射共享内存!" << std::endl;
CloseHandle(hSharedMemory);
return 1;
}
// 写入数据到共享内存
sharedData->value = 42;
strcpy_s(sharedData->message, "Hello from the first process!");
// 等待用户输入
std::cout << "按 Enter 键继续..." << std::endl;
std::cin.ignore();
// 读取共享内存中的数据
std::cout << "共享内存中的值为:" << sharedData->value << std::endl;
std::cout << "共享内存中的消息为:" << sharedData->message << std::endl;
// 解除映射并关闭共享内存句柄
UnmapViewOfFile(sharedData);
CloseHandle(hSharedMemory);
return 0;
}