1 # include<stdio.h>
2 #include <sys/types.h>
3 #include <unistd.h>
4 int g_val=100;
5 int main()
6 {
7 pid_t ret;
8 printf("before: ret=%d, id=%d\n",ret,getpid());
9 ret=fork();
10 if(ret<0)
11 {
12 perror("fork");
13 return 1;
14 }
15 else if(ret==0)
16 {
17 g_val=200;
18 printf("i am child,ret=%d, id=%d\n",ret,getpid());
19 printf("child :g_val:%d ,地址:%p\n",g_val,&g_val);
20 sleep(5);
21 }
22 else
23 {
24 printf("i am father:ret=%d ,id=%d\n",ret,getppid());
25 printf("father :g_val:%d ,地址:%p\n",g_val,&g_val);
26 sleep(30);
27 }
28 return 0;
fork()创建的父子进程共享代码,但数据各自私有,由g_val打印值的不同,便可看的出来,数据是写时拷贝的过程。而父子进程的g_val地址一样,并不代表它存储在同一块物理内存中,这里的地址一定是虚拟地址,因为打印的父、子进程的g_val值不同,所以这实际上用的是同一个变量名,有相同的虚拟地址,映射到了不同的物理内存中。