主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess

CreateFile 获得文件Handle

CreateFileMapping创建Handle的映射

MapViewOfFile在进程的虚拟地址空间,部分的表示上面的映射(可以是一部分,最大是完全的映射,不会再大)

CreateProcess创建进程

参考:

百度百科的sprintf。MapOfview

CreateFile函数详解(确实很详细) - findumars - 博客园  CreateFileMapping

MapViewOfFile - 简书    Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收 - 啦啦风吹 - 博客园

C++从文件中读取整数输入数据 - charlsonzhao的博客 - CSDN博客

创建进程参考:CreateProcess()函数详解 - 夜空中最亮的星 - CSDN博客 windows下创建进程,CreateProcess()详解及用法 - System Architect - CSDN博客 CreateProcess()函数详解 - 夜空中最亮的星 - CSDN博客 CreateProcess示例 - Hisin Wang的专栏 - CSDN博客

主要内容:

使用Win32 API设计两个利用共享内存通信的程序。生产者进程生成Catalan序列,并写入内存共享对象。消费者进程从共享内存读取并输出序列。

生成的Catalan数的数目由命令行指定。

Catalan数的性质:

h(n)=h(n-1)*(4*n-2)/(n+1);  h(n)=C(2n,n)/(n+1) (n=0,1,2,...)  h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)

h(0)=1,h(1)=1  h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)*h(0) (n>=2)

简单的求法:若令f(2)=f(3)=1, 则f(n+1)=f(n)* (4*n-6)/n 。但是这里4*n-6/n会有除不尽。

可以catalan[i]*(4*j-6)/j

主要涉及CreateFile,CreateFileMapping,GetLastError,MapViewOfFile,sprintf,OpenFileMapping,CreateProcess函数。

函数的作用:

CreateFile 获得文件Handle

CreateFileMapping创建Handle的映射

MapViewOfFile在进程的虚拟地址空间,部分的表示上面的映射(可以是一部分,最大是完全的映射,不会再大)

CreateProcess创建进程。

各函数的参数及作用:

HANDLE CreateFile( LPCTSTR lpFileName,    // 指向文件名的指针  DWORD dwDesiredAccess,    // 访问模式(写 / 读)  DWORD dwShareMode,    // 共享模式  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 指向安全属性的指针  DWORD dwCreationDisposition,   // 如何创建  DWORD dwFlagsAndAttributes,   // 文件属性  HANDLE hTemplateFile    // 用于复制文件句柄 );

HANDLE WINAPI CreateFileMapping(

_In_     HANDLE                hFile,

_In_opt_ LPSECURITY_ATTRIBUTES lpAttributes,

_In_     DWORD                 flProtect,

_In_     DWORD                 dwMaximumSizeHigh,

_In_     DWORD                 dwMaximumSizeLow,

_In_opt_ LPCTSTR               lpName

);

HANDLE CreateFileMapping(

HANDLE hFile,                       //物理文件句柄

LPSECURITY_ATTRIBUTES lpAttributes, //安全设置

DWORD flProtect,                    //保护设置

DWORD dwMaximumSizeHigh,            //高位文件大小(因为我们的游戏是32位的,所以此处设为 0)

DWORD dwMaximumSizeLow,             //低位文件大小

LPCTSTR lpName                      //共享内存名称

);

BOOL CreateProcess(

 LPCTSTR lpApplicationName, // 应用程序名称

 LPTSTR lpCommandLine, // 命令行字符串

 LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程的安全属性

 LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程的安全属性

 BOOL bInheritHandles, // 是否继承父进程的属性

 DWORD dwCreationFlags, // 创建标志

 LPVOID lpEnvironment, // 指向新的环境块的指针

 LPCTSTR lpCurrentDirectory, // 指向当前目录名的指针

 LPSTARTUPINFO lpStartupInfo, // 传递给新进程的信息

 LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息

);

遇到的问题:

1. CreateFileMapping出错

解决:GetLastError获得错误信息,发现是文件大小的参数错误,不应该为0.调整后解决(书上0,0是因为如果已经存在文件,那么会映射真实大小)

2. 如何按输入到视图遇到了问题

解决:

for(int i=0;i<sizek;i++)

{

Int;

t=sprintf((char*)lpMapAddress+j,"%d\r\n",catalan[i]); j+=t; }

3. 如何输出的问题

解决:直接采用printf %s输出

就是参考《操作系统概念第七版》P301的例子,写了两个程序。(虽然我觉得书上的确实有点问题,坑了我一个小时)

中间遇到的最大问题就是一开始忘了做错误检查,结果在CreateFileMapping就出错了,而我还傻乎乎的去找sprintf的问题,浪费了一个小时。

还有写输出程序的时候,有点想炫点c++ 的东西,结果turned out to be wasting time. 所以说编程的目的是解决问题,而不是秀自己。

还有体会深刻的一点:一定要仔细的分析函数的参数,弄清楚作用。比如CreateFileMapping中就有指定映像大小的参数,如果设为0就会导致问题(而且编译器不报错的)。(GetLastError 1006)

源码:

 

 

 

 

效果图:

 

 

利用windows api共享内存通讯的更多相关文章

  1. windows 下共享内存使用方法示例

    windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...

  2. C++ windows下共享内存

    转载:https://blog.csdn.net/tojohnonly/article/details/70246965 共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows ...

  3. Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收

    之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...

  4. nodejs利用windows API读取文件属性(dll)

    nodejs调用delphi编写的dll中,使用了dll调用windows api转读取文件属性,感觉使用nodejs也可直接调用windows api. 此处需用到windows系统的version ...

  5. 利用 Windows API Code Pack 修改音乐的 ID3 信息

    朋友由于抠门 SD 卡买小了,结果音乐太多放不下,又不舍得再买新卡,不得已决定重新转码,把音乐码率压低一点,牺牲点音质来换空间(用某些人的话说,反正不是搞音乐的,听不出差别)… 结果千千静听(百度音乐 ...

  6. C#利用Windows API 实现关机、注销、重启等操作

    using System; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; nam ...

  7. windows的共享内存

    https://blog.csdn.net/stpeace/article/details/39534361

  8. Codesys 使用共享内存 打通通讯

    Codesys V3.5 平台   提供了库SysShm,其中包含了共享内存操作的接口函数: SysSharedMemoryClose; SysSharedMemoryCreate; SysShare ...

  9. system v和posix的共享内存对比 & 共享内存位置

    参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...

随机推荐

  1. win32 sdk 环境下创建状态栏

    今天在学习状态栏,出了好多的问题,这里记录下. 要创建状态栏用:CreateStatusWindow CreateStatusWindow函数创建一个状态窗口,通常用于显示应用程序的状态.窗口通常显示 ...

  2. EntityFramework Core如何映射动态模型?

    前言 本文我们来探讨下映射动态模型的几种方式,相信一部分童鞋项目有这样的需求,比如每天/每小时等生成一张表,此种动态模型映射非常常见,经我摸索,这里给出每一步详细思路,希望能帮助到没有任何头绪的童鞋, ...

  3. 【Android】关于连续多次点击控件的控制方案(新建监听类)

    参考:防止Android过快点击造成多次事件的三种方法_胖胖的博客-CSDN博客 实现逻辑很简单: 设置限定时间 在用户点击时开始计时 若计时未超过限定时间,则不允许触发点击事件 因还未学习过Rxja ...

  4. Python小度

    这只是一个对话器!还不能听歌(反正我也没在UNIT平台配置听歌的功能)! 反正最近也不知怎么的,就想做一个AI对话器语音识别和语音输出都不要,input()和print()就行本来准备用小爱的,但要实 ...

  5. linux设备文件

    一.前言 在调用了alloc_chrdev_region函数或register_chrdev_region函数之后可以在/proc/devices中看到该设备的主设备号,比如我注册的hello模块的主 ...

  6. 大数据系列2:Hdfs的读写操作

    在前文大数据系列1:一文初识Hdfs中,我们对Hdfs有了简单的认识. 在本文中,我们将会简单的介绍一下Hdfs文件的读写流程,为后续追踪读写流程的源码做准备. Hdfs 架构 首先来个Hdfs的架构 ...

  7. Ajax编程基础

    目录 Ajax编程基础 传统网站中存在的问题 Ajax概述 Ajax的应用场景 Ajax的运行环境 Ajax运行原理及实现 Ajax运行原理 Ajax的实现步骤 1.创建Ajax对象 2.告诉Ajax ...

  8. pycharm安装完成后的一些基本设置

    1.设置背景色 file-->Setting-->Appearance&Behavior-->Appearance 2.设置主题 settings --> editor ...

  9. Tomcat窗口标题,中文乱码解决方法

    工作中,或多或少的原因,一台服务器中需要同时运行多个Tomcat服务(针对一台服务器如何同时运行多个Tomcat的配置,这里不做论述,百度很多),为了便于区分各个Tomcat的功能,通常会选择修改to ...

  10. 用git合并分支时,如何保持某些文件不被合并

    用git合并分支时,如何保持某些文件不被合并_fkaking的专栏-CSDN博客_git 合并分支 https://blog.csdn.net/fkaking/article/details/4495 ...