使用共享内存实现进程间通信的用法

本文介绍了如何在Windows环境下,通过创建和映射SharedData结构体到共享内存,实现在两个进程之间的数据共享和通信。通过CreateFileMapping和MapViewOfFile函数实现内存映射,展示了共享内存在提高程序性能和效率中的应用。
摘要由CSDN通过智能技术生成

这个示例中,我们创建了一个 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值