3

我试图了解 Boost 内存映射文件是如何工作的。以下代码有效,它完成了它应该做的事情,但问题是它生成的文件存储在磁盘上(在可执行文件的同一目录中)而不是内存。也许在某处设置了一个标志,但我找不到它......
提前感谢您提供任何信息!

    #include <iostream>
    #include <string>
    #include <cstring>
    #include <boost/iostreams/device/mapped_file.hpp>
    using std::cout;
    using std::endl;

    int main(int argc, char** argv) {
     const int blockSize = 64;
     bool writer = false;

     if(argc > 1) {
      if(!strcmp(argv[1], "w"))
       writer = true;
     }

     boost::iostreams::mapped_file_params  params;
     params.path = "map.dat";
    // params.length = 1024;     // default: all the file
     params.new_file_size = blockSize;

     if(writer) {
      cout << "Writer" << endl;
      params.mode = std::ios_base::out;
     }
     else {
      cout << "Reader" << endl;
      params.mode = std::ios_base::in;
     }

        boost::iostreams::mapped_file  mf;
        mf.open(params);

     if(writer)
     {
      char *block = mf.data();
      strcpy(block, "Test data block...\0");
      cout << "Written: " << block << endl;
     }
     else
     {
      cout << "Reading: " << mf.const_data() << endl;
     }

     mf.close();

        return 0;
    }
/*
    Compiler options: -Wall -I$(PATH_BOOST_INCLUDE) -ggdb
    Linker options: -L$(PATH_BOOST_LIBS) -lboost_iostreams-mt -lboost_system-mt -lboost_filesystem-mt -DBOOST_FILESYSTEM_NO_DEPRECATED
*/

使用的编译器:gcc 4.2.1
Boost 1.41.0
操作系统:MacOS X 10.6.2

4

2 回答 2

12

内存映射将磁盘文件映射到内存中。磁盘上必须有一个文件才能发生这种情况!

编辑:根据您的评论,听起来您想使用共享内存-请参阅http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

于 2009-12-20T16:33:05.000 回答
2

内存映射文件专门用于使文件的内容显示为程序中的内存区域。它们不是关于创建一个特殊的“内存中”文件。Boost 的概念直接取自mmapUnix 中系统调用的可用性以及大多数其他操作系统中的类似设施。它被设计为围绕此功能的通用包装器。

如果您尝试创建一个由两个进程共享的内存区域,则内存映射文件可以为您执行此操作,但代价是拥有一个反映该内存内容的磁盘文件。在 Linux 中,这仍然相当有效,因为文件内容将简单地缓存在内存中,并且与文件内容对应的程序内存页面将与缓存使用的物理页面完全相同。

如果你想要的只是一个 ramdisk...

大多数现代操作系统将内存用于进程不需要的磁盘缓存。没有真正需要虚拟磁盘。在 Linux 下,有一种称为文件系统类型的文件系统tmpfs,您可以将其用于不必在引导之间持续存在的文件系统。它的文件通常在内存中,但它们可以像任何其他类型的内存一样被换出。

是的,系统 V 共享内存存在,而且它的设计绝对糟糕。我不会用 10 英尺长的柱子碰 sys V 进程间通信原语。

于 2009-12-20T17:50:49.793 回答