子进程更新共享的mmap内存,但父进程没有变化。

问题描述 投票:0回答:1

我试图将一个由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);
}
  1. 这里的问题是什么?
  2. 为什么删除 strdup 并做这样的工作。

         s_memory->name = "test name" // with strdup throws SEGV but works without strdup. why?
    

谢谢你

c++ c ipc shared-memory mmap
1个回答
2
投票

发生这种情况是因为你只存储了 指针 到共享内存中的字符串,而字符串本身则由 strdup 通过 malloc,它在程序堆中,即在共享内存区域之外。

你应该将字符串本身存储在共享内存中,例如像这样。

struct name {
    char name[1024];
};


   // . . .

   strncpy(s_memory.name, "test name", sizeof(s_memory.name));

© www.soinside.com 2019 - 2024. All rights reserved.