繁体   English   中英

使用mmap从共享内存读取-分段错误

[英]Reading From Shared Memory Using mmap - Segmentation Fault

我仍在努力围绕共享内存。 我要完成的工作是拥有一系列豆荚。 每个吊舱还将包含一个keyValue数组。

typedef struct {
   char key[256];
   char value[256];
}keyValue;

typedef struct {
   keyValue **arr;
   int count;
}pod;

int fd;

int main(int argc, char **argv) {
   int kv_store_create(char *name) {
       return shm_open(name, O_CREAT|O_RDWR, S_IRWXU);
   }

   void kv_store_write(char *key1, char *value1) {

      static pod (*str)[28];

      ftruncate(fd, sizeof(str));

      str = (pod(*)[28])mmap(NULL, sizeof(str), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

      for (int i = 0; i < 28; i++) {
         str[i]->arr = (keyValue **)malloc(28 * sizeof(keyValue));
         for(int j = 0; j < 28; j++) {
            str[i]->arr[j] = (keyValue *)malloc(256 * sizeof(keyValue));
         }
       }

       strncpy(str[0]->arr[0]->key, key1, strlen(key1));
       strncpy(str[0]->arr[0]->value, value1, strlen(value1));
       str[0]->count = 1;
    }

   fd = kv_store_create("sharedmem");

   kv_store_write("key", "value");

因此,在这一点上,我在pod中有一个keyValue,并且如果我从同一个文件中读取共享内存,则不会有任何问题。

当我尝试从另一个进程中读取时,就会出现问题。 我有以下文件

int main(int argc, char **argv) {

    typedef struct {
        char key[256];
        char value[256];
    }keyValue;

    typedef struct {
        keyValue **arr;
        int count;
    }pod;


    int fd = shm_open("sharedmem", O_RDWR, 0);
    if (fd < 0) {
        printf("Error... opening shm\n");
    }

    struct stat s;

    if (fstat(fd, &s) == -1) {
        printf("Error fstat\n");
    }

    pod (*str2)[28];

    str2 = (pod(*)[28])mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0);

    printf("%s", str2[0]->arr[0]->key); 

}

printf导致段错误,我相信它正在尝试访问未分配任何内存的部分,而该printf实际上会在我的第一个文件中打印。

我试图弄清楚为什么会吐出一个错误,以及我应该走什么路线才能在两个进程之间共享结构数组

谢谢!

你说的是:

每个吊舱还将包含一个keyValue数组。

事实并非如此,因为豆荚是:

typedef struct {
   keyValue **arr;
   int count;
}pod;

其中不包含KeyValue数组。 它包含一个指向KeyValue*数组的指针,但是KeyValue对象本身既不在pod也不在由arr指向的内存中。 因此,它们绝对不在您在两个进程之间共享的内存中。

因此,读取过程将获得一个pod ,该pod中包含指向拥有过程中的地址的指针; 显然,该指针在读取器中完全没有意义,因为进程不共享内存,因此在另一个进程中拥有对象的地址或多或少等于具有随机数。

简而言之,您必须确保共享内存区域实际上包含您要共享的所有对象,而不仅仅是指向它们的指针。 而且,由于mmap在两个进程中不太可能返回相同的地址,因此即使在共享内存中插入指向插入对象的指针也无济于事。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM