【问题标题】:C struct member pointer in shared memory (mmap)共享内存中的 C 结构成员指针 (mmap)
【发布时间】:2016-10-31 20:38:02
【问题描述】:

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

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

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

任何帮助将不胜感激!

【问题讨论】:

  • 共享内存通常会映射到不同进程的不同地址。您不能在进程之间传递指针,但可以从共享内存的开头传递偏移量。
  • 谢谢,我通过丢弃 A 结构中的另一个指针并在客户端和服务器中简单地执行 struct B *other=(struct B *)(ptr+1) 来实现它。跨度>

标签: c dynamic process shared-memory mmap


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多