-
#include<stdio.h>??
-
#include<string.h>??
-
#include<stdlib.h>??
-
#include<unistd.h>??
-
??
-
void?main()??
-
{??
-
????char?str[6]="hello";??
-
??
-
????pid_t?pid=fork();??
-
??
-
????if(pid==0)??
-
????{??
-
????????str[0]=‘b‘;??
-
????????printf("子进程中str=%s\n",str);??
-
????????printf("子进程中str指向的首地址:%x\n",(unsigned?int)str);??
-
????}??
-
????else??
-
????{??
-
????????sleep(1);??
-
????????printf("父进程中str=%s\n",str);??
-
????????printf("父进程中str指向的首地址:%x\n",(unsigned?int)str);??
-
????}??
-
}??
子进程中str=bello子进程中str指向的首地址:bfdbfc06 ??这里取的是虚拟地址父进程中str=hello父进程中str指向的首地址:bfdbfc06 ?这里取的是虚拟地址
解释:採用“写拷贝技术”,刚fork时候,子进程没有改动数据段的值。则子进程和父进程全部代码共享,同样的物理地址。同样的虚拟地址,
当子进程改动某个变量时候,这个变量才真正复制到子进程,拥有自己的物理地址。可是虚拟地址还是一样,两个同样的虚拟地址指向的是不同的物理地址。
所以出现上面的答案。
这里虚拟地址同样 ? 可是物理地址不一样