Проблема с файлами, отображенными в памяти boost:они отправляются на диск вместо оперативной памяти

StackOverflow https://stackoverflow.com/questions/1936266

Вопрос

Я пытаюсь понять, как работают файлы, отображенные в памяти 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
*/

Используемый компилятор:ссагпз 4.2.1
Повышение 1.41.0
Операционная СИСТЕМА:macOS X 10.6.2

Это было полезно?

Решение

Отображение памяти отображает дисковые файлы в память.Чтобы это произошло, на диске должен быть файл!

Редактировать: Судя по вашим комментариям, похоже, что вы хотите использовать общую память - см. http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Другие советы

Файлы с отображением памяти предназначены специально для отображения содержимого файла в виде области памяти в вашей программе.Речь идет не о создании специального файла "в памяти".Концепция Boost основана непосредственно на доступности mmap системный вызов в Unix и аналогичные средства в большинстве других операционных систем.Он разработан как универсальная оболочка вокруг этой возможности.

Если то, что вы пытаетесь сделать, это создать область памяти, совместно используемую двумя процессами, файлы с отображением памяти могут сделать это за вас, но ценой наличия файла на диске, который отражает содержимое этой памяти.В Linux это все равно будет достаточно эффективно, поскольку содержимое файла будет просто кэшироваться в памяти, а страницы памяти вашей программы, соответствующие содержимому файла, будут точно такими же физическими страницами, которые используются кэшем.

Если то, что вам нужно, - это просто ramdisk...

Большинство современных операционных систем используют память для дискового кэша, который не нужен процессам.Реальной необходимости в ramdisk нет.В Linux существует тип файловой системы, называемый tmpfs который вы можете использовать для файловых систем, которым не обязательно сохраняться между загрузками.Его файлы, как правило, будут находиться в памяти, но их можно заменить точно так же, как и любой другой вид памяти.

Да, разделяемая память system V существует, и она имеет абсолютно ужасный дизайн.Я бы не стал прикасаться к примитивам межпроцессных коммуникаций sys V 10-футовым шестом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top