Windows共享内存示例

本文介绍Windows环境下C++与C程序通过共享内存进行进程间通信的方法。利用CreateFileMapping创建共享内存区,MapViewOfFile将其映射到进程地址空间,OpenFileMapping打开已存在的共享内存区。示例代码展示了服务端读取与客户端写入数据的过程。

开发环境:window 10 Qt5.13.1

windows下的进程间通信有多种方式,管道,无名管道,共享内存,消息,Socket等,但不的方式使用的场景不同,如现在有一个场景是,程序A(C++语言)调用程序B(C语言)时时获取程序B的进度,如果用管道读取一个进度就退出了,使用起来不方便,而共享内存可以时时读取放在共享内存上的进度时,操作起来也比较方便,使用的API有三个,如下:

CreateFileMapping()//创建共享内存

MapViewOfFile()//将共享内存映射到进程的地址空间

OpenFileMapping()//打开共享内存

代码示例如下:

服务端,读取数据:

#include <stdio.h>
#include <Windows.h>


int createSharedMemory()
{
    TCHAR szName[] = TEXT("Global\\Position");
    LPVOID pBuffer;//共享内存指针
    //1.创建共享内存
    HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, szName);
    if(NULL == hMapFile)
    {
        qDebug() << "Create file mapping object failed=======" << GetLastError();
        return -1;
    }
    //2.获取与共享内存映射的指针
    pBuffer = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    //3.循环读取数据
    int index = 0;
    while(1)
    {
        qDebug() << "read data ======" << QString((char *)pBuffer) << ++index;
        Sleep(1000);
    }

    UnmapViewOfFile(pBuffer);
    CloseHandle(hMapFile);
    hMapFile = NULL;
    return 0;
}

int main()
{
    int aa = createSharedMemory();
    printf("Hello World! aa ===============%d\n", aa);
    return 0;
}

 

客户端,写数据:

#include <stdio.h>
#include <Windows.h>



int createSharedMemory()
{
    TCHAR szName[] = TEXT("Global\\Position");
    LPVOID pBuffer;//共享内存指针
    //1.打开共享内存
    HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,  0, szName);
    if(NULL == hMapFile)
    {
        printf("open file mapping object failed=======%d\n", GetLastError());
        return -1;
    }
    //2.获取与共享内存映射的指针
    pBuffer = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
    //3.循环读取数据
    int a = 0;
    while(1)
    {
        char szName[16];
        sprintf(szName, "sharemap=%d", ++a);
        strncpy(pBuffer, szName, strlen(szName));
        printf("write data ======%s\n", (char *)pBuffer);
        Sleep(1000);
    }

    UnmapViewOfFile(pBuffer);
    CloseHandle(hMapFile);
    hMapFile = NULL;
    return 0;
}

int main()
{
    int aa = createSharedMemory();
    printf("Hello World! aa ===============%d\n", aa);
    return 0;
}

 

服务端也可以写数据,客户端也可以读数据,修改一些代码即可实现

 

参考文档:

https://docs.microsoft.com/en-us/windows/win32/memory/creating-named-shared-memory
https://blog.youkuaiyun.com/stpeace/article/details/39534361
https://blog.youkuaiyun.com/u013052326/article/details/76359588
https://www.cnblogs.com/dongsheng/p/4460944.html

update:2020-03-28

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值