managed shared memory with basic_string
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
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
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
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
On Friday, March 07, 2014 04:01:32 PM Sean K wrote: > 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 ? I assume you're working on POSIX like system. You can either: * create shm from client not server * use fchown on shm * use fchmod on shm * use chown,chmod utilities on /dev/shm/the_name_of_shm B > > 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 Kwrote: > > 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#interproc > >> esscommunication_managed_shared_memory > >> > >> 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.htm > >> l > >> > >> http://en.highscore.de/cpp/boost/interprocesscommunication.html#interproc > >> esscommunication_managed_shared_memory (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 > >> > >> > >> > >> #include > >> #include > >> #include > >> #include > >> > >> #include > >> #include > >> #include > >> > >> using namespace std; > >> using namespace boost::interprocess; > >> > >> > >> int main() { > >> > >> typedef boost::interprocess::allocator >> boost::interprocess::managed_shared_memory::segment_manager> > >> ShmemAllocator;>> > >> typedef basic_string , ShmemAllocator> > >> > >> 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 ("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 > >> > >> > >> > >> #include > >> #include > >> #include > >> #include > >> #include > >> > >> #include > >> #include > >> #include > >> > >> > >> using namespace std; > >> using namespace boost::interprocess; > >> > >> > >> int main() { > >> > >> typedef boost::interprocess::allocator >> boost::interprocess::managed_shared_memory::segment_manager> > >> ShmemAllocator;>> > >> typedef boost::interprocess::basic_string , > >> > >> ShmemAllocator> 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 ("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
participants (2)
-
Bartek Taczała
-
Sean K