2016-10-31 10 views
0

У меня есть два процесса, которые обращаются к одной и той же общей памяти. Однако я хочу сохранить динамически выделенный массив в общей памяти. Я знаю, что это может быть достигнуто с помощью гибких элементов массива, но я не могу их использовать.C struct member pointer в общей памяти (mmap)

Я могу выделить и получить доступ к динамическому массиву с сервера, но всякий раз, когда мой клиент пытается получить к нему доступ, я получаю segfault. Я могу получить доступ к другим членам структуры просто отлично. Вот логика моего кода. Я выделил дополнительное пространство в конце сегмента разделяемой памяти и задал массив, указывающий на конец сегмента.

struct A{ 
    int a; 
    struct B *other; 
} 
struct B{ 
    int b; 
} 
... 
//Server 
fd=shm_open("shared", O_CREAT | O_RDWR, 0666); 
ftruncate(fd, sizeof(struct A)+200*sizeof(struct B)); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
ptr->other=(struct B *)(ptr+1);  
int i=0; 
for(i=0;i<200;i++){ 
    struct B b; 
    ptr->other[i]=b; 
} 
... 
//Client 
int fd=shm_open("shared", O_RDWR, 0666); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
printf("%i", ptr->other[0]);// SEGFAULT 

Любая помощь будет оценена!

+4

совместно используемой памяти, как правило, отображенного по разным адресам в различных процессах. Вы не можете передавать указатели между процессами, но вместо этого вы можете передавать смещения с начала разделяемой памяти. – EOF

+0

Спасибо, я получил его, отбросив другой указатель внутри моей структуры и просто выполнив struct B * other = (struct B *) (ptr + 1) как на клиенте, так и на сервере. – user1354784

ответ

0

Решение было определить другой список вне структуры

struct A{ 
    int a; 
} 
struct B{ 
    int b; 
} 
... 
//Server 
fd=shm_open("shared", O_CREAT | O_RDWR, 0666); 
ftruncate(fd, sizeof(struct A)+200*sizeof(struct B)); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
struct B *other=(struct B *)(ptr+1);  
int i=0; 
for(i=0;i<200;i++){ 
    struct B b; 
    other[i]=b; 
} 
... 
//Client 
int fd=shm_open("shared", O_RDWR, 0666); 
struct A *ptr=mmap(NULL, sizeof(struct A)+200*sizeof(struct B), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 
struct B *other=(struct B *)(ptr+1); 
printf("%i", other[0]);