1

2 つのプログラムの非常に小さな例があります。1 つは共有メモリ セグメントを書き込み、もう 1 つはそれから読み取ります。std::string(および他のコンテナ)に潜在的な問題があることを認識しているのでboost::interprocess::string、どれがboost::containers::string. これには本当に基本的で単純なものが欠けていると確信していますが、それを見ることはできません!

いずれにせよ、概要は、文字列が小さい場合 (SSO よりも大きいと思います)、最初のプログラムを実行するとメモリが書き込まれ、2 番目のプログラムは完全に適切に読み取られます。ただし、ここの例のように文字列を非常に大きくすると、読み取りプログラムでセグメンテーション違反が発生します。読み取りと書き込みの両方が同じプロセスにあるが、機能が異なる場合 (したがって、ipc 以外でデータを共有しない場合)、これで成功します 。writeipc.ccの下のコード

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <boost/interprocess/containers/string.hpp>
#include <iostream> 
#include <utility> 

int main() 
{
  typedef boost::interprocess::string bi_string;

  boost::interprocess::shared_memory_object::remove("Test"); 
  boost::interprocess::managed_shared_memory managed_shm(boost::interprocess::create_only, "Test", 65536); 


  bi_string* i = managed_shm.construct<bi_string>("string")("abcdefghijklmnopqrstuvwxyzaskl;dfjaskldfjasldfjasdl;fkjwrotijuergonmdlkfsvmljjjjjjjjjjjjjj");  // make smaller (ie "jjjjjjjjjjjjjj" and test passes 
  std::cout << "inserting into shm" << *i << std::endl; 

  std::pair<bi_string*, size_t> q = managed_shm.find<bi_string>("string"); 
  std::cout << *q.first << std::endl;
 while(true)
    std::cout << "still running"; // hack to keep process running (not required)
}

readipc.cc

#include <boost/interprocess/managed_shared_memory.hpp> 
#include <boost/interprocess/containers/string.hpp>
#include <iostream> 

int main() 
{
  typedef boost::interprocess::string bi_string;
  boost::interprocess::managed_shared_memory managed_shm(boost::interprocess::open_only, "Test"); 

  std::pair<bi_string*, std::size_t> p = managed_shm.find<bi_string>("string"); 
  std::cout << "existing value" << *p.first << std::endl; 

}
4

1 に答える 1