[英]Segmentation fault when reading from a pointer to shared memory from shared memory in a child process
[英]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.