Gyo*_*ely 1 c++ winapi shared-memory
我有3个通过命名管道进行通信的进程:服务器,写入器,读取器。其基本思路是,作家可以存储大量(〜GB)的二进制块上的服务器,以及读卡器(S)可以找回。但是使用内存映射代替在命名管道上发送数据。
该服务器与创建一个未命名的文件支持的映射CreateFileMapping与PAGE_READWRITE保护,然后复制该句柄到作家。后作家已完成其工作,把手被复制到任何数量的感兴趣的读者。
该作家手柄与映射MapViewOfFile在FILE_MAP_WRITE模式。
该阅读器手柄的地图,MapViewOfFile在FILE_MAP_READ|FILE_MAP_COPY模式。
在阅读器上,我需要写时复制语义,因此,只要只读取映射,它就在所有阅读器实例之间共享。但是,如果读者想在其中写入内容(例如,就地解析或图像处理),则应将影响限制在修改过程中,并尽可能减少复制页面的数量。
问题
当读者尝试写入映射时,它死于分段错误,好像FILE_MAP_COPY没有考虑到那样。上述方法有什么问题?根据MSDN,这应该有效...
我们在Linux上也实现了相同的机制(通过mmapfd传入AF_UNIX辅助缓冲区),并且它按预期工作。
MapViewOfFile设计或/和记录不良的问题。这是外壳(功能受限)ZwMapViewOfSection。将dwDesiredAccess参数MapViewOfFile转换为的Win32Protect参数ZwMapViewOfSection。
该FILE_MAP_READ|FILE_MAP_COPY组合转换为PAGE_READONLY网页保护,因为这个你和写获取页面错误。
您FILE_MAP_COPY只需要使用标志-它转换为PAGE_WRITECOPY页面保护,在这种情况下,所有功能都将起作用。
当然是直接ZwMapViewOfSection与PAGE_WRITECOPY页面保护配合使用的最佳解决方案
| 归档时间: |
|
| 查看次数: |
480 次 |
| 最近记录: |