now another problem has arisen since related to this managed shared memory.
When the server is started and is running as root, the client cannot access
or write to that shared memory unless the client is also running as root.
How can that shared memory be accessed by a non-root ?
The server is allowed or must run as root so that it can do some root only
operation with that string passed from the managed shared memory.
On Fri, Mar 7, 2014 at 12:52 PM, Sean K
I figured it out.
In the reader, I was using the wrong basic_string.
by accident, I was using the std::basic_string. I should have been using boost::interprocess::basic_string.
I changed that. Then it worked.
On Fri, Mar 7, 2014 at 12:37 PM, Sean K
wrote: I am new to boost so please pardon if this question has already been asked.
I was able to build a shared memory IPC client and server using "int" primitive type successfully.
I need to send a fixed number of "char" (primitive type). At first I tried to define a struct of a fixed char
struct { char data[1024]; } dataset;
typedef dataset mychararray;
and use this like how this example shows for 'int"
http://en.highscore.de/cpp/boost/interprocesscommunication.html#interprocess...
But for some reason it did not compile due to the boost::interprocess::managed_shared_memory.construct () not accepting that kind of datatype.
So, I looked at the basic_string implementation based on these two web sites. http://prakharprakhar.blogspot.com/2009/12/boost-shared-memory-vector.html
http://en.highscore.de/cpp/boost/interprocesscommunication.html#interprocess... (basic_string variant)
I am built a reader and writer separate app. The reader will look for content. If it does not find it, it will wait or sleep and try again, etc. If it finds something it will try to print the basic_string content that I sent over.
I thought I had it correctly built but obviously it is not since the reader server crashes or cores when it tries to access the p.first content.
Below are the two programs (along with the build.sh which compiles each). I am testing this as a 32 bit app on a 64 bit redhat5 and 32 bit centos6.
You will notice in the strreader.cc that when I try to access the basic_string, that it crashes.
I ran the reader (server) within the 32 bit eclipse debugger, and the memory addresses and content of the p BStringPair looks fine. Anybody have some ideas or can anybody try this and see what you can tell what is wrong.
strreader.cc
#include <iostream>
#include
#include #include #include #include <iostream> #include <string> #include <cstdlib>
using namespace std; using namespace boost::interprocess;
int main() {
typedef boost::interprocess::allocator
ShmemAllocator; typedef basic_string BString; typedef std::pair
BStringPair; int count = 0; shared_memory_object::remove("Highscore"); while (true) { managed_shared_memory segment(open_or_create, "Highscore", 65536);
if (segment.get_num_named_objects() > 0){ BStringPair p = segment.find<BString> ("str"); printf("stuff in memory\n");
if (p.first ){
// THIS IS WHERE IT CRASHES!!! //printf("%s \n",(p.first->c_str()) ); //int strlen = p.first->size(); } printf("p.second: %d \n", p.second); }
shared_memory_object::remove("Highscore"); //printf("one: %s", one.first); //printf("two: %s", two.first);
int msecs = 2000; boost::this_thread::sleep(boost::posix_time::milliseconds(msecs)); printf("sleeping...\n"); }
return 0; }
build.sh for the reader
g++ -m32 -fPIC -Xlinker -zmuldefs strreader.cc -o strreader -I/common/COTS/boost_1_42_0/include -L/common/COTS/boost_1_42_0/lib -lboost_thread -lboost_system -pthread
strwriter.cpp
#include <iostream>
#include
#include #include #include #include #include <iostream> #include <string> #include <cstdlib>
using namespace std; using namespace boost::interprocess;
int main() {
typedef boost::interprocess::allocator
ShmemAllocator; typedef boost::interprocess::basic_string BString; try { shared_memory_object::remove("Highscore"); printf("cleared out memory\n");
managed_shared_memory segment(open_or_create, "Highscore", 65536);
printf("initialized managed shared memory \n"); ShmemAllocator allocInst (segment.get_segment_manager()); BString bstrData(segment.get_segment_manager()); bstrData = "hello";
std::string data = "Hello"; //BString bstrToSend(data.begin(), data.end()); //BString bstrToSend(data.c_str());
BString *mystring = segment.construct<BString> ("str")(bstrData);
//mystring="Hello";
printf("inserted mystring into shmvector \n"); } catch (boost::interprocess::bad_alloc e) { printf("we caught bad alloc\n"); printf("explanation: %s", e.what()); throw; } catch (...) { printf("caught unknown exception\n"); throw; }
printf("wrote number"); return 0; }
build.sh for the writer: g++ -m32 -fPIC -Xlinker -zmuldefs strwriter.cpp -o strwriter -I/common/COTS/boost_1_42_0/include -L/common/COTS/boost_1_42_0/lib -lboost_thread -lboost_system -pthread
-- Sean
-- Sean
-- Sean