gpt4 book ai didi

共享内存中的 C 结构成员指针 (mmap)

转载 作者:行者123 更新时间:2023-11-30 16:55:14 25 4
gpt4 key购买 nike

我有两个进程访问相同的共享内存。但是我想在共享内存中存储动态分配的数组。我知道这可以使用灵活的数组成员来实现,但我不允许使用它们。

我能够从服务器分配和访问动态数组,但每当我的客户端尝试访问它时,我都会遇到段错误。尽管如此,我可以很好地访问其他结构成员。这是我的代码的逻辑。我在共享内存段的末尾分配了一些额外的空间,并将数组设置为指向该段的末尾。

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

如有任何帮助,我们将不胜感激!

最佳答案

解决方案是在结构之外定义另一个列表

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]);

关于共享内存中的 C 结构成员指针 (mmap),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40350216/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com