各位好以下是我来验证子进程与父进程之间不共享数据的代码
1 #include<unistd.h>
2 #include<stdio.h>
3 #include<stdlib.h>
4 int x = 9;
5 int main(int args, char *argc[])
6 {
7 int status;
8 while(1)
9 {
10 if(fork() != 0)//father process
11 {
12 x++;
13 waitpid( -1, &status, 0 );
14 printf("father's x is %d\n", x);
15 printf("father's x is address %o\n", &x);
16 exit(0);
17 }
18 else //son processes
19 {
20 x--;
21 printf("son's x is %d\n", x);
22 printf("son's x is address %o\n", &x);
23 exit(0);
24 }
25 }
26 return 0;
27 }
在shell中执行该文件编译后的默认程序 a.out 后结果输出如下:
[root@localhost test]# ./a.out
son's x is 8
son's x is address 1001113660
father's x is 10
father's x is address 1001113660
[root@localhost test]#
问题来了,,,我能理解父进程与子进程的全局变量 x 的不同,但是对他们的 x 的地址却相同是什么原因啊?是不是他们的虚拟地址相同,但对应的物理地址不同啊?????各位大侠来帮小弟理解下啊!!!
引用 4 楼 的回复:
引用 1 楼 的回复:
因为子进程的地址空间完全是从父进程复制过来的(copy on write),所以x的地址相同是正常的
但是虽然父子进程的x地址相同,但不并是同一个变量,因为fork过后父子进程的进程空间是相互独立的,不会相互影响.
感觉还是很矛盾,既然两个进程空间是互相独立的,但是地址是一样的,那么就指向同一个空间。除非就像楼主说的一样,这是虚拟地址,虚拟地址可以一样……
你理解的差不多了,那个一样的地址是线性地址,每个进程的相同的线性地址都可以映射到不同的物理地址上。在fork的时候,子进程从父进程了copy了task_struct结构,其中task_struct里的mm就是线性地址的使用情况,mm也会被copy给子进程,所以在fork之前声明的变量,在fork后在父进程和子进程里的线性地址是一样的。
http://bbs.csdn.net/topics/390223958