我设置了一个全局变量
n=2
,然后我使用fork()
创建了一个子进程,然后我修改了父子进程中n的值并打印,子进程中的--n
和父进程中的++n
处理。然后 print()
他们,然后我得到 2 1 3
输出。但我继续在父子进程中打印n
的地址,发现它们指向同一个地址。
我知道现代linux采用
Copy on Write
策略,只有当进程尝试修改内存时,操作系统才会为修改的内存页分配新的物理内存,并将修改的内容写入其中。原始内存页仍然保留给其他进程。所以我的问题是为什么两个n都指向同一个地址?
这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <wait.h>
volatile int n=2;
int main() {
pid_t pid;
printf("%d\n",n);
pid = fork();
if (pid < 0) {
perror("Fork failed");
exit(1);
} else if (pid == 0) {
--n;
printf("%p\n",&n);
printf("%d\n",n);
exit(0);
} else {
wait(NULL);
++n;
printf("%p\n",&n);
printf("%d\n",n);
}
return 0;
}
输出是
2
0x55af5a07e010
1
0x55af5a07e010
3
在具有虚拟内存的系统中,每个进程都有自己的地址空间。它们具有相同地址的事实并不意味着它们位于同一位置,因为它们在不同进程的地址空间中位于相同地址。