[英]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);
}
為什么刪除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.