簡體   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