子进程更新共享 mmap 内存,但父进程没有更改

Child process updates shared mmap memory but no change in parent process

本文关键字:进程 共享 更新 mmap 内存 子进程      更新时间:2023-10-16

我正在尝试将结构保存在 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 Processn");
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);
}
  1. 这里有什么问题?
  2. 为什么删除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));