簡體   English   中英

子進程更新共享 mmap memory 但父進程沒有變化

[英]Child process updates shared mmap memory but no change in parent process

我正在嘗試將結構保存在由 mmap 創建的共享 memory 中,如下面的代碼所示:

問題是,子進程似乎正在更新共享 memory 中的結構,但是當父進程嘗試讀取它時,它會引發錯誤。

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?

謝謝

發生這種情況是因為您僅將指向字符串的指針存儲在共享 memory 中,字符串本身由strdup通過malloc分配,它位於程序堆中,即在共享 ZCD69B4957F06CD818D7BF3D619Z8E 區域之外。

您應該將字符串本身存儲在共享 memory 中,例如:

struct name {
    char name[1024];
};


   // . . .

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM