对fork函数的疑惑,求解!

初学Linux,对Linux不甚理解,望高手不惜赐教。

“unix编程圣经”《unix环境高级编程》讲到,当调用fork函数后,子进程会拷贝父进程除正文段的所有资源,即拷贝已初始化的数据段、.bss段、堆、栈、命令行和环境变量。小弟在main函数外定义一个int型变量val=5,程序如下:

 

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 
 4 int val = 5;
 5 //int *ptr = &val;
 6 int main(int argc,char *argv[])
 7 {
 8     int pid;    
 9     if((pid = fork()) < 0)
10     {
11         perror("error occured when fork function is called");
12     }
13     if(pid == 0)  //child process
14     {        
15         printf("the address of val in child process is :%p\n",&val);
16     }
17     else      //parent process
18     {
19        sleep(2); 
      printf("the address of val in parent process is :%p\n",&val); 20 } 21 printf("program exit!\n"); 22 return 0; 23 }

 

注意看:val在父进程和子进程的地址是一样的,地址怎么会一样呢?!子进程所持有的数据不是父进程数据段的一个拷贝,两个val应该位于不同的地址存储空间呀。PS:我的Linux运行在VMware虚拟机上。

 

Go on,若在原来的程序上添加添加一个整形指针ptr=&val,(推理:ptr在父进程和子进程所指向的地址也是一样,都为val的地址),程序如下:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 
 4 int val = 5;
 5 int *ptr = &val;
 6 int main(int argc,char *argv[])
 7 {
 8     int pid;    
 9     if((pid = fork()) < 0)
10     {
11         perror("error occured when fork function is called");
12     }
13     if(pid == 0)
14     {        
15         (*ptr)++;        
16         printf("the address of val in child process is :%p\n",&val);
17         printf("ptr = %p\n",ptr);
18         printf("val = %d\n",val);
19     }
20     else
21     {
22         sleep(2);        
23         printf("the address of val in parent process is :%p\n",&val);
24         printf("ptr = %p\n",ptr);
25         printf("val = %d\n",val);
26     }
27     printf("--------------------------------------------\n");
28     return 0;
29 }

疑惑,ptr所指向的地址相同,对ptr所指向的内容在子进程进行加1操作,按理说应该会导致父进程的val也会加1,实际情况是,父进程的val依旧是5,糊涂了,哎!

望高手指点迷津!

 

posted on 2013-03-11 21:36  liyanfasd  阅读(169)  评论(0编辑  收藏  举报

导航