当前位置: 代码迷 >> 综合 >> fork()例程--父子进程,对线性地址的说明(3)
  详细解决方案

fork()例程--父子进程,对线性地址的说明(3)

热度:5   发布时间:2023-12-08 22:23:40.0

各位好以下是我来验证子进程与父进程之间不共享数据的代码 
  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

 

 

  相关解决方案