#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "string.h"
#include <sys/stat.h>
#include <fcntl.h>
#include "sys/mman.h"
int main () {
int *ptr, *i;
ptr = mmap(NULL, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANON, -1, 0);
*ptr = 1;
*i = 1;
if (fork() == 0) {
printf("child : &ptr = %p, ptr = %p, *ptr = %d\n", &ptr, ptr, *ptr);
printf("child : i = %d, &i = %p\n", *i, &i);
*ptr = 2;
*i = 2;
sleep(2);
exit(0);
}
sleep(1);
printf("parent : &ptr = %p, ptr = %p, *ptr = %d\n", &ptr, ptr, *ptr);
printf("parent : i = %d, &i = %p\n", *i, &i);
return 0;
}
虽然 父子进程 的 i 虚拟地址相同,但是 mmu 映射到的 物理地址不同