我想用boost编写一个简单的应用程序,将字符串对象传递给其他进程。它编译得很好,但是当我尝试从第二个进程打印出字符串时,以下消息被放入控制台并且第二个进程崩溃:
../ boost_1_44_0 /升压/间/同步/ POSIX / interprocess_recursive_mutex.hpp:107: 空虚 提高::进程间:: interprocess_recursive_mutex ::解锁(): 断言`res == 0'失败。
第一个流程代码:
shared_memory_object::remove(SHARED_MEMORY_NAME);
managed_shared_memory mshm(create_only, SHARED_MEMORY_NAME, SHARED_MEMORY_SIZE );
mshm.construct<string>( IP_STRING_NAME )("Message to other process");
string syscall(argv[0]);
std::system( (syscall+" &").c_str() ); //starting second process
第二个流程代码:
managed_shared_memory mshm( open_or_create, SHARED_MEMORY_NAME, SHARED_MEMORY_SIZE );
std::pair<string * , size_t > p= mshm.find<string>(IP_STRING_NAME);
cout<<"string is "<<*p.first<<endl;
如何以正确的方式使我的应用程序正常工作?
答案 0 :(得分:6)
从你的代码中不清楚你是指boost :: interprocess :: string还是std :: string,但是从我几小时的boost :: interprocess(相当令人沮丧的......)经验来看,你不需要... < / p>
所以,这是一个
首先,您需要定义一个特殊字符串:
typedef boost::interprocess::allocator<char, boost::interprocess::managed_shared_memory::segment_manager> CharAllocator;
typedef boost::interprocess::basic_string<char, std::char_traits<char>, CharAllocator> my_string;
其次,发送应该使用:
// (mshm is the managed_shared_memory instance from the question)
mshm.construct<my_string>( SOME_STRINGY_NAME )(
"Message to other process",
mshm.get_segment_manager());
最后,阅读应用应该:
std::pair<my_string * , size_t > p= mshm.find<my_string>(SOME_STRINGY_NAME);
cout<< "got " << p.second << " strings " << endl;
cout<< "first string is->"<<p.first->c_str()<<endl;
注意:所有这些复杂性的原因是this。
干杯