Windows 进程间通信(八)共享内存(FileMapping)
来源:互联网 发布:固高科技 知乎 编辑:程序博客网 时间:2024/04/28 14:19
这时我们使用文件映射实现共享内存。
FileMapping用于将存在于磁盘的文件放进一个进程的虚拟地址空间,并在该进程的虚拟地址空间中产生一个区域用于“存放”该文件,这个空间就叫做File View,系统并同时产生一个File Mapping Object(存放于物理内存中)用于维持这种映射关系,这样当多个进程需要读写那个文件的数据时,它们的File View其实对应的都是同一个File
当然在一个应用向文件中写入数据时,其它进程不应该去读取这个正在写入的数据。这就需要进行一些同步的操作。
下边来看一下具体的API。
1) 物理文件句柄
如果需要和物理文件关联,要确保你的物理文件创建的时候的访问模式和"保护设置"匹配,比如: 物理文件只读,内存映射需要读写就会发生错误。推荐你的物理文件使用独占方式创建。
如果使用 INVALID_HANDLE_VALUE,也需要设置需要申请的内存空间的大小,无论物理文件句柄参数是否有效,这样 CreateFileMapping 就可以创建一个和物理文件大小无关的内存空间给你, 甚至超过实际文件大小,如果你的物理文件有效,而大小参数为0,则返回给你的是一个和物理文件大小一样的内存空间地址范围。返回给你的文件映射地址空间是可以通过复制,集成或者命名得到,初始内容为0。
2) 保护设置
3) 高位文件大小
32位地址空间, 设置为0。
4) 共享内存名称
命名可以包含 "Global" 或者 "Local" 前缀在全局或者会话名空间初级文件映射. 其他部分可以包含任何除了()以外的字符, 可以参考 Kernel Object Name Spaces.
5) 调用CreateFileMapping的时候GetLastError的对应错误
使用函数CreateFileMapping创建一个想共享的文件数据句柄,然后使用MapViewOfFile来获取共享的内存地址,然后使用OpenFileMapping函数在另一个进程里打开共享文件的名称,这样就可以实现不同的进程共享数据。
下边是C#是对使用的接口函数声明:
[DllImp
public static extern IntPtr CreateFile(string lpFileName,
[DllImp
public static extern IntPtr CreateFileMapping(IntPtr hFile,
[DllImp
public static extern bool FlushViewOfFile(IntPtr lpBaseAddress,
[DllImp
public static extern IntPtr MapViewOfFile(
[DllImp
public static extern IntPtr OpenFileMapping(
[DllImp
public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);
[DllImp
public static extern bool CloseHandle(IntPtr handle);
我们在示例里Server端建立的一个FileMapping,命名为:@"Global\MyFileMappingObject";这样我们在Client端就可以打开同名的FileMapping
- Windows 进程间通信(八)共享内存(FileMapping)
- Windows 进程间通信 共享内存(FileMapping)_C#实现
- windows 进程间通信(共享内存)
- windows 进程间通信(共享内存)
- windows 进程间通信(共享内存)
- 5.VC(Custom)-进程间共享内存映射FileMapping
- windows进程间通讯--文件映射(FileMapping)
- Windows环境进程间通信(二):共享内存方式
- Linux进程间通信(IPC)编程实践(八)共享内存的使用-POSIX 共享内存(API)
- 嵌入式 Linux进程间通信(八)——共享内存
- Windows进程间通信之共享内存
- Windows进程间通信-共享内存
- Windows进程间共享内存通信实例
- Windows进程间通信--共享内存
- Windows进程间通信-共享内存
- 进程间通信---共享内存(shmget)
- 进程间通信---共享内存(shmget)
- 进程间通信---共享内存(shmget)
- LayoutInflater.from(this)
- Ubuntu小私房(5)--Linux命令大全
- Bookmarks--How to establish Android Develop Environment
- android获取正在运行的桌面的包名
- 关于客户问题反馈的类型机制
- Windows 进程间通信(八)共享内存(FileMapping)
- MZ自测——遥远的村庄(并查集)
- poj 2983 差分约束+SPFA
- 一点基础的东西:Objective-C的类型和常量
- struts2中怎么获取session,jsp页面参数信息的值
- 在Eclipse中使用JUnit4进行单元测试
- 贪心 hdu-1338-Game Prediction
- XMPP——Smack[6]离线消息和离线文件的实现
- 金融支付-银联卡支付系统产品介绍