【问题标题】:writing to memory mapped file while it is memory-mapped在内存映射时写入内存映射文件
【发布时间】:2018-02-27 19:24:34
【问题描述】:

我已将磁盘上的文件映射如下:

 const wchar_t fileName[] = L"temp.txt";
 HANDLE h = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 HANDLE fileMap = CreateFileMapping(h, NULL, PAGE_READWRITE, 0x0, 1024, NULL);
 char *ptr = (char *)MapViewOfFile(fileMap, FILE_MAP_WRITE | FILE_MAP_READ, 0, 0, 1024)

是否可以在内存映射时由另一个进程写入同一个文件?

FILE *fp = fopen("temp.txt", "w+"); if(NULL == fp) printf("Failed to open\n");

如果文件是内存映射的,上面的代码总是打印“无法打开”。

【问题讨论】:

  • 我不喜欢你混合不同 API 的方式......无论如何,看看CreateFile 的第三个参数的文档......
  • 你的意思是 fopen 和 createfilemapping 吗?我正在尝试模拟用例
  • 文件通常不会以独占模式打开(用于写入),从而阻止其他应用程序写入它们吗?
  • 当然可以
  • 在 fopen 中使用 "w+" 将尝试重新创建文件!试试“r+”。

标签: c++ c winapi memory-mapped-files memory-mapping


【解决方案1】:

一致共享使用的答案很简单:是的,除了 remote 文件。 (参见CreateFileMapping 和/或MapViewOfFile 的文档)。

对于共享使用,您必须以共享模式(您未指定)打开文件 (CreateFile)。 我不知道fopen 在哪个共享模式下运行,但我怀疑您的fopen 失败是因为缺少CreateFile 的共享模式。如果在使用共享模式时fopen 仍然失败,您应该改用CreateFile

【讨论】:

  • 我尝试将CreateFiile 的第三个参数更改为FILE_SHARED_WRITE,现在可以在同一进程中以写入模式打开文件。但现在允许由另一个进程打开它。
  • @user413201:用 fopen 替换 "w+" 为 "r+" !
  • @user413201:是的。关键是如果文件已经打开(通过任何方式),那么重新创建它(“w+”)是无效的,因为这涉及删除和创建。可以删除正在使用的文件,但在关闭文件的最后一个句柄(由任何进程)之前不会删除它。
  • @engf-010: "w+" 是一个 truncate 如果它已经存在,而不是删除和创建。
  • @cdarke:我认为你是对的。几十年没用过这个功能!但是,这不太正确,我只是不记得最后一次了!
猜你喜欢
  • 2016-02-23
  • 2016-01-08
  • 2018-05-18
  • 2012-10-11
  • 1970-01-01
  • 2010-11-01
  • 2011-05-14
  • 2016-12-08
  • 2010-09-26
相关资源
最近更新 更多