进程的地址空间是相互独立的,也就是说,每个进程都有自己的页目录和页表。那么一旦调用fork(),父子进程的地址空间就是两个空间,如果子进程对某部分内存进行了修改,父进程是看不到的。比如下面这个测试:

 
  
  1. #include <stdio.h> 
  2. #include <sys/types.h> 
  3. #include <unistd.h> 
  4. struct xx  
  5. {  
  6.         int a;  
  7. };  
  8. int main()  
  9. {  
  10.         pid_t pid;  
  11.         struct xx s;  
  12.         s.a = 5;  
  13.         struct xx* sp = &s;  
  14.         pid = fork();  
  15.         if (pid > 0)  
  16.         {  
  17.                 printf("parent show %p, %p, a =  %d\n", sp, &sp->a, sp->a);  
  18.                 sp->a = 4;  
  19.                 //while(sp->> 0);  
  20.                 sleep(10);  
  21.                 printf("parent show %p, %p, a = %d\n", sp, &sp->a, sp->a);  
  22.                 printf("parent exit\n");//exit(0);  
  23.         }  
  24.         else  
  25.         {  
  26.                 //while(sp->a == 5);  
  27.                 printf("child show %p, %p, a = %d\n", sp, &sp->a, sp->a);  
  28.                 sp->a = -1;  
  29.                 printf("child change a to %d\n", sp->a);  
  30.         }  
  31.         return 0;  
  32. }  

编译运行结果是:

 
  
  1. [root@141 test]# gcc test.c   
  2. [root@141 test]# ./a.out  
  3. parent show 0x7fffe86b64a0, 0x7fffe86b64a0, a =  5  
  4. child show 0x7fffe86b64a0, 0x7fffe86b64a0, a = 5  
  5. child change a to -1  
  6. parent show 0x7fffe86b64a0, 0x7fffe86b64a0, a = 4  
  7. parent exit  

        一切都明了~

        调了一晚上的项目,原来是父子进程的处理出了问题。基础知识还是很重要!