#include <stdio.h> #include <sys/shm.h> #include <sys/stat.h> #include <string> #include <vector> #include <iostream> using namespace std; struct LOCK { string name; string type; vector <string> pids; }; int main () { int segment_id; LOCK* shared_memory; struct shmid_ds shmbuffer; int segment_size; const int shared_segment_size = 0x6400; /* Allocate a shared memory segment. */ segment_id = shmget (IPC_PRIVATE, shared_segment_size, IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR); /* Attach the shared memory segment. */ shared_memory = (LOCK*) shmat (segment_id, 0, 0); printf ("shared memory attached at address %pn", shared_memory); /* Determine the segment's size. */ shmctl (segment_id, IPC_STAT, &shmbuffer); segment_size = shmbuffer.shm_segsz; printf ("segment size: %dn", segment_size); /* Write a string to the shared memory segment. */ //sprintf (shared_memory, "Hello, world."); shared_memory -> name = "task 1"; shared_memory -> type = "read"; (shared_memory -> pids).push_back("12345"); (shared_memory -> pids).push_back("67890"); /* Detach the shared memory segment. */ shmdt (shared_memory); /* Reattach the shared memory segment, at a different address. */ shared_memory = (LOCK*) shmat (segment_id, (void*) 0x5000000, 0); printf ("shared memory reattached at address %pn", shared_memory); /* Print out the string from shared memory. */ //printf ("%sn", shared_memory -> name); cout << "Name of the shared memory: " + shared_memory -> name << endl; /* Detach the shared memory segment. */ shmdt (shared_memory); /* Deallocate the shared memory segment. */ shmctl (segment_id, IPC_RMID, 0); return 0; }
I got the code from a tutorial on shared memory. It worked until I defined struct LOCK and tried to write LOCKs instead of char* into the shared memory.
Could someone please help me figure out the problem here that causes the segmentation fault?
Advertisement
Answer
You are placing vector
s and string
s into shared memory. Both those classes allocate memory of their own, which will be allocated within the address space of whatever process generates the allocation, and will produce a segfault when accessed from the other process. You could try specifying allocators to use that shared memory, but since in C++03 allocators are assumed to be stateless I’m not sure if it will be possible.
Consider checking out how Boost.Interprocess does it.