[英]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.