Chapter17— Memory-Mapping Files 进程间共享数据进行通信
2013-02-27 22:24
316 查看
第十七章的实例有个利用 Memory-Mapped File 来实现进程间共享数据和通信。
第一个参数 hFile 设为 INVALID_HANDLE_VALUE 表示你仅是将该 Memory-Mapped File Object 存放在 系统的分页文件中,而不是某个指定的磁盘文件当中。
第二个参数 lpAttributes 是安全属性,一般默认是 NULL
第三个参数 flProtect 是指定文件视图的保护属性的。具体的就参考MSDN,下面实例中就使用 PAGE_READWRITE 值,表示有读写权限
第四个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的高32位
第五个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的低32位
第六个参数 lpName,指定给文件视图的名字。
第一个参数 hFileMappingObject 就填入 上面 CreateFileMapping 函数的返回值
第二个参数 dwDesiredAccess ,指定进程的访问权
限,下面实例中使用 FILE_MAP_READ | FILE_MAP_WRITE 表示有读写权限,注意此处的权限不能高于试图文件本身的权限,即第一步中指定的 flProtect 指定的权限。
第三个参数 dwFileOffsetHigh,表示视图文件的偏移量64位中的高 32 位
第四个参数 dwFileOffsetLow,表示视图文件的偏移量64位中的低 32 位
第五个参数 dwNumberOfBytesToMap,表示总有多少个字节被映射入该进程的地址空间
《windows核心编程》(笔记)系列文章是本人看《windows核心编程》时的一些学习笔记,有疏忽之处,欢迎各位网友指正。QQ邮箱:job.zhanghui@qq.com
Step1:调用 CreateFileMapping 函数创建一个 Memory-Mapped File Object。
该函数的原型如下:HANDLE WINAPI CreateFileMapping( __in HANDLE hFile, __in LPSECURITY_ATTRIBUTES lpAttributes, __in DWORD flProtect, __in DWORD dwMaximumSizeHigh, __in DWORD dwMaximumSizeLow, __in LPCTSTR lpName );
第一个参数 hFile 设为 INVALID_HANDLE_VALUE 表示你仅是将该 Memory-Mapped File Object 存放在 系统的分页文件中,而不是某个指定的磁盘文件当中。
第二个参数 lpAttributes 是安全属性,一般默认是 NULL
第三个参数 flProtect 是指定文件视图的保护属性的。具体的就参考MSDN,下面实例中就使用 PAGE_READWRITE 值,表示有读写权限
第四个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的高32位
第五个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的低32位
第六个参数 lpName,指定给文件视图的名字。
Step2:调用 MapViewOfFile 函数将文件视图映射入 进程地址空间。
该函数的原型如下:LPVOID WINAPI MapViewOfFile( __in HANDLE hFileMappingObject, __in DWORD dwDesiredAccess, __in DWORD dwFileOffsetHigh, __in DWORD dwFileOffsetLow, __in SIZE_T dwNumberOfBytesToMap );
第一个参数 hFileMappingObject 就填入 上面 CreateFileMapping 函数的返回值
第二个参数 dwDesiredAccess ,指定进程的访问权
限,下面实例中使用 FILE_MAP_READ | FILE_MAP_WRITE 表示有读写权限,注意此处的权限不能高于试图文件本身的权限,即第一步中指定的 flProtect 指定的权限。
第三个参数 dwFileOffsetHigh,表示视图文件的偏移量64位中的高 32 位
第四个参数 dwFileOffsetLow,表示视图文件的偏移量64位中的低 32 位
第五个参数 dwNumberOfBytesToMap,表示总有多少个字节被映射入该进程的地址空间
Step3:读写 mapping file 内容
第三步中 MapViewOfFile 函数返回一个指针,通过该指针就可以实现对 mapping file 的读写,这样进程间就可以进行通信了。Step4:之后调用 UnmapViewOfFile 将Memory-Mapping File 从进程的地址空间中移除
Step5:最后关闭 Memory-Mapping File 句柄
运行过程截图如下
代码示例
#include <windows.h> #include <TCHAR.H> #include <stdio.h> void main() { int choice; HANDLE hFile_Map = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData")); if (hFile_Map == NULL) { printf("Failed to create file mapping!\n"); getchar(); return; } else if (GetLastError() == ERROR_ALREADY_EXISTS) { printf("Mapping already exists - not created.\n"); getchar(); } // File mapping created successfully. // Map a view of the file into the address space. PVOID pView = MapViewOfFile(hFile_Map, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); if (NULL == pView) { printf("Failed to map view of file.\n"); getchar(); return; } while (true) { getchar(); system("cls"); printf("\n\t1.写入 mapping file 内容."); printf("\n\t2.读取 mapping file 内容."); printf("\n\t3.退出程序"); printf("\n\n请输入你的选择序号:"); scanf("%d", &choice); if (choice == 3) break; switch (choice) { case 1: printf("输入要写入的内容:"); scanf("%s", pView); break; case 2: printf("显示已写入的内容:"); printf("%s\n", pView); break; default: printf("你的选择序号有误。\n"); break; } getchar(); } UnmapViewOfFile(pView); CloseHandle(hFile_Map); }
《windows核心编程》(笔记)系列文章是本人看《windows核心编程》时的一些学习笔记,有疏忽之处,欢迎各位网友指正。QQ邮箱:job.zhanghui@qq.com
相关文章推荐
- Chapter17— Memory-Mapping Files 进程间共享数据进行通信
- [Linux管道和IPC]使用信号量和共享内存进行父子进程通信
- WM_COPYDATA进行进程之间的数据通信
- 如何在.net平台合理安全的使用Named Shared Memory以在进程间共享数据
- 11.python并发入门(part10 多进程之间实现通信,以及进程之间的数据共享)
- 线程间无需特别的手段进行通信,因为线程间可以共享数据结构,也就是一个全局变量可以被两个线程同时使用,不过要注意的是线程间需要做好同步。
- Python 进程线程之间通信方式(2.1,共享数据实现进程之间通信)
- Python 进程线程之间通信方式(2,共享数据实现进程之间通信)
- 使用FIFO来进行两个进程间的通信
- 利用WM_COPYDATA进行进程间单向通信
- python 进程间共享数据 (三)
- WM_COPYDATA实现进程间数据共享
- 黑马程序员--读写字节数组,随机读写流,集合IO的思维导图,多线程部分,单例设计模式,线程和进程的概念,Java中的线程的创建方式,线程的随机性,线程的状态图,多线程操作共享数据的安全性,死锁
- java 程序与其它进程的数据通信
- C#中使用命名管道进行进程通信的实例
- opnet各进程数据共享机制
- 简单的,两个不同进程间的共享内存通信(大小写转换)
- 1.4 进程通信之共享内存
- <php+mysql>上传文件到指定文件夹,共享数据和脚本,文件验证,脚本之间的通信
- 进程之间数据通信的方法(一)