我仍然試圖圍繞共享內存打包頭。我試圖完成的是有一個豆莢數組。每個窗格還將包含一個keyValue數組。使用mmap從共享內存中讀取 - 分割錯誤
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的實際上在我的第一個文件打印。
我試圖找出爲什麼吐出一個錯誤,我應該採取什麼樣的路線,能夠分享兩個進程之間的結構數組
謝謝!
[不是原因]'strncpy(str [0] - > arr [0] - > key,key1,strlen(key1));'*完全*錯誤。 – wildplasser