我试图将一个由mmap创建的结构体保存在共享内存中,如下面的代码所示。
问题是 是,子进程似乎在更新共享内存中的结构,但当父进程试图读取它时,它抛出了一个错误。
struct name{
char * name;
};
int main(int argc, char ** argv){
struct name * s_memory = mmap(NULL, sizeof(struct name), PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
pid_t p = fork();
if(p == 0) {
printf("In Child Process\n");
s_memory->name = strdup("test name");
printf("Child Process name: %s \n", s_memory->name); // Print - test name ok!!
puts("exit child process");
exit(1);
} else {
sleep(1);
printf("Parent Process name: %s \n", s_memory->name); // SEGV !! - Not Updated
}
exit(0);
}
为什么删除 strdup
并做这样的工作。
s_memory->name = "test name" // with strdup throws SEGV but works without strdup. why?
谢谢你
发生这种情况是因为你只存储了 指针 到共享内存中的字符串,而字符串本身则由 strdup
通过 malloc
,它在程序堆中,即在共享内存区域之外。
你应该将字符串本身存储在共享内存中,例如像这样。
struct name {
char name[1024];
};
// . . .
strncpy(s_memory.name, "test name", sizeof(s_memory.name));