gpt4 book ai didi

c++ - 子进程更新共享的mmap内存,但父进程未更改

转载 作者:行者123 更新时间:2023-12-02 10:01:51 26 4
gpt4 key购买 nike

我试图将结构保存在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));

    关于c++ - 子进程更新共享的mmap内存,但父进程未更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62174503/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com