У меня есть два процесса, которые обращаются к одной и той же общей памяти. Однако я хочу сохранить динамически выделенный массив в общей памяти. Я знаю, что это может быть достигнуто с помощью гибких элементов массива, но я не могу их использовать.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
Любая помощь будет оценена!
совместно используемой памяти, как правило, отображенного по разным адресам в различных процессах. Вы не можете передавать указатели между процессами, но вместо этого вы можете передавать смещения с начала разделяемой памяти. – EOF
Спасибо, я получил его, отбросив другой указатель внутри моей структуры и просто выполнив struct B * other = (struct B *) (ptr + 1) как на клиенте, так и на сервере. – user1354784