Pergunta

Estou tentando entender como funcionam os arquivos mapeados da memória. O código a seguir funciona, faz o que deveria fazer, mas o problema é que o arquivo que gera é armazenado no disco (no mesmo diretório do executável) em vez da memória. Talvez haja uma bandeira para se pôr em algum lugar, mas eu não consegui encontrá -lo ...
Agradecemos antecipadamente por qualquer informação!

    #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
*/

Compilador usado: GCC 4.2.1
Boost 1.41.0
OS: MacOS x 10.6.2

Foi útil?

Solução

O mapeamento de memória mapeia os arquivos de disco na memória. Tem que haver um arquivo no disco para que isso aconteça!

Editar: A partir de seus comentários, parece que você deseja usar a memória compartilhada - veja http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Outras dicas

Os arquivos mapeados de memória são especificamente sobre o fato de o conteúdo de um arquivo ser exibido como uma região de memória em seu programa. Eles não são sobre criar um arquivo especial 'na memória'. O conceito de Boost é retirado diretamente da disponibilidade do mmap Sistema chama no UNIX e instalações semelhantes na maioria dos outros sistemas operacionais. Ele foi projetado para ser um invólucro genérico em torno dessa capacidade.

Se o que você está tentando fazer é criar uma região de memória compartilhada por dois processos, os arquivos mapeados de memória podem fazer isso por você, mas com o custo de ter um arquivo no disco que reflete o conteúdo dessa memória. No Linux, isso ainda será razoavelmente eficiente, pois o conteúdo do arquivo será simplesmente armazenado em cache na memória e as páginas de memória do seu programa correspondentes ao conteúdo do arquivo serão as mesmas páginas físicas exatas que estão sendo usadas pelo cache.

Se o que você quer é apenas um Ramdisk ...

A maioria dos sistemas operacionais modernos usa memória para cache de disco que não é necessário pelos processos. Não há necessidade real de um Ramdisk. Em Linux, existe um tipo de sistema de arquivos chamado tmpfs que você pode usar para sistemas de arquivos que não precisam persistir entre as botas. Seus arquivos geralmente estarão na memória, mas podem ser trocados como qualquer outro tipo de memória.

Sim, existe a memória compartilhada do Sistema V e possui um design absolutamente abismal. Eu não tocaria nas primitivas de comunicações interprocessantes do SYS V com um poste de 10 pés.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top