【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】

在通信协议的开发中,有的时候为了本地调试的需要,需要实现进程之间的通信。在windows系统中,进程通信的方式很多,比如说有管道通信、内存映射、socket通信、剪切板通信等等。但是,其中,我认为最好的方式还是内存映射的方式,简单、明了。因为通信的数据是被很多进程共享的,所以必要的互斥措施是非常必要的。只要处理好互斥的关系,内存映射可以为我们做好不少事情。

在内存映射中,所需要的基本函数其实非常简单:(1)创建文件映射,即函数CreateFileMapping;(2)打开文件映射,即函数OpenFileMapping;(3)关闭文件映射,即函数UnmapViewOfFile。名称是server和client识别的唯一媒介。下面就是一个范例,贴出来的代码是一个简单的服务端和客户端代码,略带修改。源代码来自于《精通Windows API,函数、接口、编程实例》,请注意版权声明。

服务端代码如下所示,

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#define BUF_SIZE 256
LPTSTR szName = TEXT("mapObject");
LPTSTR szMsg = TEXT("msg");
void main(int argc, char* argv[])
{
HANDLE  hMapFile;
LPTSTR pBuf;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE,
NULL,
PAGE_READWRITE,
0,
BUF_SIZE,
szName
);
if(hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
return;
}
pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);
if(NULL == pBuf)
{
return ;
}
CopyMemory(pBuf, szMsg, strlen(szMsg));
getch();
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}

客户端代码如下,

#include <windows.h>
#include <stdio.h>
#include <conio.h>
#pragma comment (lib, "User32.lib")
#define BUF_SIZE 256
LPTSTR szName = TEXT("mapObject");
void main(int argc, char* argv[])
{
HANDLE  hMapFile;
LPTSTR pBuf;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS,
FALSE,
szName
);
if(hMapFile == NULL )
{
return ;
}
pBuf = (LPSTR)MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
BUF_SIZE);
if(NULL == pBuf)
{
return ;
}
printf(pBuf);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
}

随想录(基于内存映射的进程通信)相关推荐

  1. 实验六 实现一个基于内存映射的设备驱动程序

    实验六 实现一个基于内存映射的设备驱动程序 目录 实验六 实现一个基于内存映射的设备驱动程序 实验环境 一.实验目的 二.实验内容 三.实验步骤 四.实验总结 实验环境 操作系统版本:ubuntu-1 ...

  2. java 内存映射文件进程间通讯_[转]Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile...

    进程间的通信方式有很多种, 上次我们说了最傻瓜的"共享外存/文件"的方法. 那么, 在本文中, 我们即将学习"共享内存"的方式实现进程间的通信, 这是IPC最快 ...

  3. 基于内存搜索的进程检测方法

    搜索内存检测进程的原理 1) 问题的提出--进程检测 Rootkit等后门为了在系统中长期驻留,需要隐藏相应的信息.这些信息包括自启动项.文件.进程.模块.端口.注册表.服务等.其中,以进程隐藏特别突 ...

  4. c++ 内存映射文件进程间共享数据

    int main(int argc, char *argv[])   {       //RecursiveDelete("C:\\20_128\\");       //Self ...

  5. 【操作系统实验】Linux进程通信—共享内存通信、管道通信

    Linux进程通信-共享内存通信.管道通信 一.实验目的: 二.实验题目: 1. 试设计程序利用共享内存完成如下进程通信 1.shmget函数 2.shmat函数 3.shmdt函数 4.shmctl ...

  6. Binder跨进程通信原理(三):Binder IPC实现原理

    1. 动态内核可加载模块 && 内存映射 正如上一章所说, 跨进程通信是需要内核空间做支持的. 传统的 IPC 机制如 管道, Socket, 都是内核的一部分, 因此通过内核支持来实 ...

  7. 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件

    本文背景: 在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用:根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制. 本 ...

  8. windows 内存映射文件

    4.内存管理机制--内存映射文件 (Map)    和虚拟内存一样,内存映射文件可以用来保留一个进程地址区域:但是,与虚拟内存不同,它提交的不是物理内存或是虚拟页文件,而是硬盘上的文件. ·使用场合 ...

  9. 【朝花夕拾】Android跨进程通信总结篇

    前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...

最新文章

  1. 2017中国电商峰会共话“一带一路”网上商机
  2. ural1147 Shaping Regions
  3. VS2010新建Web网站与新建Web应用程序的区别
  4. VMWare虚拟机-锁定文件失败,打不开磁盘的解决办法
  5. 阿里云、腾讯云、UCloud 、华为云云主机对比测试报告
  6. UIView方法,属性的集合
  7. Oracle9i数据库DataGuard实施及维护手册3
  8. 数据库中的范式 Normal Form(用最简单的语言描述!)
  9. Python 语言程序设计(1)
  10. 2021年游戏项目的十大编程语言:C++、Java、JavaScript、Python均在榜上
  11. jsp里table边框线_JSP好看表格边框
  12. 请问如何让路由器信号增强
  13. 如何应对未过试用期的技术人员离职
  14. shell中base64编解码的使用
  15. Java中的Swing概述
  16. 小程序轮播图_厉害!对准不认识的野生菌拍个图,云大学生设计的这个小程序就能自动识别...
  17. html 在 ul 加分隔线,的Html边界分隔在UL-L1之间的标题标记
  18. pythonista免费下载-pythonista 3ios
  19. (已更新)【增强版短视频去水印源码】去水印微信小程序+去水印软件源码
  20. php学习----php实现验证码

热门文章

  1. redhat6.5配置阿里云yum源
  2. Node.js 模块系统
  3. ENGINE_API CXNoTouch
  4. 视图层、业务逻辑层、数据访问层及实体层的关系(入门)
  5. ARC单例模式的实现
  6. Codeforces 510 E. Fox And Dinner
  7. 随记(五)--上传图片耗时问题
  8. php随笔11-Thinkphp常用系统配置大全
  9. linux mysql更改用户权限
  10. Android设备上使用WiFinspect抓取网络通讯包