使用共享内存在进程间进行通信

最近在做一个项目要在多个程序间传递数据,在网上调研了一番准备采用这种最简单的方式,总结记录一下。
在两个独立的进程之间如果想要互相通信,我们可以借助一个公共的媒介,例如开辟一个文件作为介质,一个进程往里写数据,另一个进程从中读数据,这样就实现了进程间数据通信,这种方法被称为“共享外存/共享文件”。本文介绍的的共享内存与其类似,只不过这个公共的介质变成了系统预留(reserve)的进程内的地址空间,有的地方又把这种“共享内存”的方式叫做“内存映射文件”方式。
主要使用的API函数有:

CreateFileMapping
MapViewOfFile
UnmapViewOfFile
CloseHandle

存储程序,这段代码通过命令行输入一个int数字,然后存储到共享的内存位置:

#include <iostream>
#include <Windows.h>
#include <tchar.h>

static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024;

using namespace std;

int main()
{
    int a;
    __shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
    __shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);

    while(1)
    {
        cin>>a;
        *((int*)__shmbuf) = a;
    }

    UnmapViewOfFile(__shmbuf);
    CloseHandle(__shmem);
    __shmem  = INVALID_HANDLE_VALUE;
    __shmbuf = NULL;
}

读取程序,这段代码一直读取该段地址的数据,发现变化后打印出来:

#include <iostream>
#include <Windows.h>
#include <tchar.h>

static HANDLE __shmem = INVALID_HANDLE_VALUE;
char* __shmbuf = NULL;
static const int SHM_SIZE = 1024;  // 共享内存的大小

using namespace std;

int main()
{
    int LastData = 0;
    __shmem = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, SHM_SIZE, _T("SHARE_MEMORY_ADDR"));
    __shmbuf = (char *)MapViewOfFile(__shmem, FILE_MAP_ALL_ACCESS, 0, 0, SHM_SIZE);

    while(1)
    {
        if(LastData != *((int *)__shmbuf))
        {
            LastData = *((int *)__shmbuf);
            printf("%d\n",LastData);
        }
        Sleep(100);
    }
}

这里就简单测试一下,unmap和close函数就瞎搞了,实际使用的时候需要加上。(PS:如果使用Qt报错了,在pro里加上DEFINES-= UNICODE)
如图,右边的窗口是在一直从命令行读取数据然后存储,左边窗口显示数据的变化。


1.PNG

在实际使用中,可以使用结构体等数据类型,方便数据的操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一.管道机制(pipe) 1.Linux的fork操作 在计算机领域中,尤其是Unix及类Unix系统操作系统中,...
    Geeks_Liu阅读 9,096评论 1 9
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,850评论 19 139
  • Android跨进程通信IPC整体内容如下 1、Android跨进程通信IPC之1——Linux基础2、Andro...
    隔壁老李头阅读 15,910评论 19 113
  • 关于Button 文字大小自适应 常用的宏 颜色的宏(随机色和自定义颜色) 关于cell和tableView
    破夕_____________阅读 1,495评论 0 0
  • 1.感恩萍萍邀约,朋友齐聚一堂,把酒言欢。跟朋友在一起无比愉悦轻松。 2.感恩宇宙的眷顾,老公一路平安顺利的到家。...
    默沫_阅读 1,373评论 0 0

友情链接更多精彩内容