Frage

Ich versuche zu verstehen, wie Boost-Speicher-Dateien arbeiten abgebildet. Der folgende Code funktioniert, ist es tut, was es tun soll, aber das Problem ist, dass die Datei erzeugt sie auf der Festplatte gespeichert (im selben Verzeichnis der ausführbaren Datei) anstelle des Speichers. Vielleicht gibt es ein Flag zu setzen irgendwo, aber ich konnte es nicht finden ...
Vielen Dank im Voraus für jede Info!

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

Compiler verwendet: gcc 4.2.1
Erhöhung 1.41.0
OS: MacOS X 10.6.2

War es hilfreich?

Lösung

Memory Mapping ordnet Plattendateien in den Speicher. Es muss eine Datei auf der Festplatte sein, damit dies geschehen kann!

Edit: Aus Ihren Kommentaren, es klingt wie Sie gemeinsam genutzten Speicher verwendet werden sollen - siehe http://www.boost.org/doc/libs/1_41_0/doc/html/interprocess/quick_guide.html

Andere Tipps

Memory Mapped-Dateien sind speziell über den Inhalt einer Datei verursacht in Ihrem Programm zu zeigen, als ein Bereich des Speichers. Sie sind nicht über eine spezielle Erstellen ‚im Speicher‘ Datei. Boost-Konzept ist in Unix und ähnlichen Einrichtungen in den meisten anderen Betriebssystemen direkt von der Verfügbarkeit des mmap Systemaufruf gemacht. Es ist so konzipiert, ein generischer Wrapper um diese Fähigkeit zu sein.

Wenn das, was Sie versuchen, einen Speicherbereich von zwei Prozessen gemeinsam zu tun erstellen ist, abgebildet Speicherdateien, die für Sie tun können, aber auf Kosten der mit einer On-Disk-Datei, die den Inhalt dieses Speichers widerspiegelt. Unter Linux wird dies noch einigermaßen effizient sein, da der Inhalt der Datei wird einfach im Speicher und Ihr Programm-Seiten-Speicher zwischengespeichert werden entsprechend dem Inhalt der Datei werden die gleichen genauen physikalischen Seiten sein, wie sie durch den Cache verwendet wird.

Wenn das, was Sie wollen, ist nur eine RAM-Disk ...

Die meisten modernen Betriebssysteme verwenden Speicher für Festplatten-Cache, die nicht durch Prozesse benötigt wird. Es gibt keine wirkliche Notwendigkeit für einen RAM-Disk. Unter Linux gibt es einen Dateisystem-Typen tmpfs genannt, dass Sie für Dateisysteme verwenden können, müssen nicht zwischen den Schuhen bestehen bleiben. Seine Dateien werden in der Regel in Erinnerung sein, aber sie können nur werden wie jede andere Art von Speicher ausgelagert werden kann.

Ja, System V Shared Memory existiert, und es hat ein absolut miserabel Design. Ich würde nicht die sys V Interprozesskommunikation Primitiven mit einem 10-Meter langen Stange berühren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top