对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,糊涂了,哎!
望高手指点迷津!