利用windows api共享内存通讯
主要涉及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共享内存通讯的更多相关文章
- windows 下共享内存使用方法示例
windows下共享内存使用方法较 linux 而言微微复杂 示例实现的功能 有一个视频文件,一块内存区域 : 程序 A,将该视频写入该内存区域 : 程序 B,从该内存区域读取该视频 : 代码模块实现 ...
- C++ windows下共享内存
转载:https://blog.csdn.net/tojohnonly/article/details/70246965 共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows ...
- Windows进程间通信--共享内存映射文件(FileMapping)--VS2012下发送和接收
之前以为两个互不相关的程序a.exe b.exe通信就只能通过网络,人家说可以通过发消息,我还深以为不然,对此,我表示万分惭愧. 之前课本上说的进程间通信,有共享内存.管道等之类的,但没有自己操刀写过 ...
- nodejs利用windows API读取文件属性(dll)
nodejs调用delphi编写的dll中,使用了dll调用windows api转读取文件属性,感觉使用nodejs也可直接调用windows api. 此处需用到windows系统的version ...
- 利用 Windows API Code Pack 修改音乐的 ID3 信息
朋友由于抠门 SD 卡买小了,结果音乐太多放不下,又不舍得再买新卡,不得已决定重新转码,把音乐码率压低一点,牺牲点音质来换空间(用某些人的话说,反正不是搞音乐的,听不出差别)… 结果千千静听(百度音乐 ...
- C#利用Windows API 实现关机、注销、重启等操作
using System; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; nam ...
- windows的共享内存
https://blog.csdn.net/stpeace/article/details/39534361
- Codesys 使用共享内存 打通通讯
Codesys V3.5 平台 提供了库SysShm,其中包含了共享内存操作的接口函数: SysSharedMemoryClose; SysSharedMemoryCreate; SysShare ...
- system v和posix的共享内存对比 & 共享内存位置
参考 http://www.startos.com/linux/tips/2011012822078.html 1)Linux和所有的UNIX操作系统都允许通过共享内存在应用程序之间共享存储空间. 2 ...
随机推荐
- Nginx和Tomcat配置SSL实现https访问
环境:CentOS 7 Nginx版本: nginx/1.18.0 1. 安装nginx 详细步骤可以参考如下官网:http://nginx.org/en/linux_packages.html#RH ...
- 如何封装Promise对象?
最近看到了一个有趣的Promise的方法,这里记录下来 <script> class MyPromise { constructor(executor) { // 初始化state赋值为p ...
- 一步步使用SpringBoot结合Vue实现登录和用户管理功能
前后端分离开发是当今开发的主流.本篇文章从零开始,一步步使用SpringBoot结合Vue来实现日常开发中最常见的登录功能,以及登录之后对用户的管理功能.通过这个例子,可以快速入门SpringBoot ...
- CISCO 如何重置3850交换机密码
SUMMARY STEPS: Connect a terminal or PC to the switch. Set the line speed on the emulation software ...
- LVS负载均衡IP隧道模式原理介绍以及配置实战
LVS 基本工作原理 当用户向负载均衡调度器(Director Server)发起请求,调度器将请求发往至内核空间 PREROUTING 链首先会接收到用户请求,判断目标 IP 确定是本机 IP,将数 ...
- 提供个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录 文件所在目录不存在则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删 除该目录
import java.io.IOException; import java.util.Scanner; import org.apache.hadoop.fs.*; public class G_ ...
- 找出10000内的素数 CSP
"Problem: To print in ascending order all primes less than 10000. Use an array of processes, SI ...
- The Garbage Collection Handbook
The Garbage Collection Handbook The Garbage Collection Handbook http://gchandbook.org/editions.html ...
- LOJ2436
题目描述 幼儿园里有 N 个小朋友, lxhgww 老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于 ...
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...