c - 如果我打算通过多个进程访问文件的多个部分,使用 CreateFileMapping 和 MapViewOfFile 的正确方法是什么?

标签 c windows winapi io memory-mapped-files

我正在用 C 语言编写一个组件,该组件将由多个访问同一文件的不同进程使用。

每个进程将同时访问文件的不同部分,主要用于读取,但也用于写入。

我试图找出正确的方法是否是:

选项A: 对于每个进程,为整个文件调用一次 CreateFileMapping,然后在不同的部分多次使用 MapViewOfFile 来访问它需要的部分,这意味着如果我希望访问 10 个部分,我将为整个文件调用一次 CreateFileMapping,端到端,然后 MapViewOfFile 10 次,文件的每个部分一次。

或者

选项B: 对于每个进程在其希望访问的每个特定部分上调用 CreateFileMapping 和 MapViewOfFile,这意味着如果我希望访问 10 个部分,我将分别调用 CreateFileMapping 和 MapViewOfFile 10 次。

谢谢!

最佳答案

您肯定需要在每个进程中至少调用一次 CreateFileMappingMapViewOfFile 才能访问数据。不过,您无需多次调用他们。当然,如果映射本身很大,您可能需要取消映射并重新映射以节省虚拟地址空间,但如果数据量不是那么大,您可以跳过此操作。

映射文件映射后,您的进程可以直接看到数据。读取和写入操作会立即发生,为了序列化访问并防止线程竞争情况,您需要使用 Interprocess Communication ,例如信号量。

您可能想阅读和研究示例代码:Shared Memory 。还可以尝试谷歌搜索 MapViewOfFile + WaitForMultipleObjects了解更多信息。

关于c - 如果我打算通过多个进程访问文件的多个部分,使用 CreateFileMapping 和 MapViewOfFile 的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8952214/

相关文章:

java - 如何从Excel中读取Appium的Maven项目的数据?

c++ - 具有FileLock()的同步多进程在同一文件上读/写c++ win32

linux - 为什么在 gcc 中覆盖 union 成员没有警告?

c - 指针比较与字符串比较 strcmp 的性能

php - HWIOAuthBundle - Windows 上的 SSL 证书

python - 有没有办法通过 python 将任务删除到 Windows 任务计划程序?

c - 为什么当电流已经超过 `strtod` 时 `DBL_MAX*0.1` 忽略数字

c - 使用 switch 语句从函数返回值来调用函数

c++ - 使用 C++ 查找系统电源状态

c++ - 正确处理子类过程中的 WM_PASTE