歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Linux中父子進程Fork與malloc關系示例

Linux中父子進程Fork與malloc關系示例:

  1. #include <stdio.h>   
  2. #include <stdlib.h>   
  3. #include <string.h>   
  4.   
  5. #define SIZE 16   
  6.   
  7. int main()  
  8. {  
  9.     char *data;  
  10.       
  11.     data=(char *)malloc(SIZE);  
  12.     if(data==NULL)  
  13.     {     
  14.         printf("mallco failed!\n");  
  15.         exit(1);  
  16.     }  
  17.   
  18.     char *str="test data";  
  19.     strcpy(data,str);  
  20.     printf("before fork,the data is: %s\n",data);  
  21.     printf("before fork the addr of mem is: %p\n",data);  
  22.       
  23.     int pid;  
  24.     if((pid=fork())==0)//父進程查看分配的內存信息   
  25.     {  
  26.         strcpy(data,"I am parent");  
  27.         printf("In parent,the data is: %s\n",data);  
  28.         printf("In parent,the addr of mem is: %p\n",data);  
  29.           
  30.         sleep(10);  
  31.         printf("In parent,the data is: %s\n",data);  
  32.         printf("In parent,the addr of mem is: %p\n",data);  
  33.     }  
  34.     else  
  35.     {  
  36.         sleep(5);  
  37.         strcpy(data,"I am child");  
  38.         printf("In child,the data is: %s\n",data);  
  39.         printf("In child,the addr of mem is: %p\n",data);  
  40.     }  
  41.   
  42.     free(data);  
  43.   
  44.     return 0;  
  45.   
  46. }  

運行結果:

  1. pine@pine-pc:/home/song/study/C$ ./malloc   
  2. before fork,the data is: test data  
  3. before fork the addr of mem is: 0x9e3a008  
  4. In parent,the data is: I am parent  
  5. In parent,the addr of mem is: 0x9e3a008  
  6. In child,the data is: I am child  
  7. In child,the addr of mem is: 0x9e3a008  
  8. pine@pine-pc:/home/song/study/C$ In parent,the data is: I am parent  
  9. In parent,the addr of mem is: 0x9e3a008  

通過例子說明,mallco之後進行fork,父子進程之間與malloc內存區域的關系。

通過例子可以看出,在fork之後,父子進程中得到的內存區域是各自獨立的,父子進程各自的操作相互不會影響。可以看到,fork之後,父進程向內存之寫入了 “I am parent”,接著等待一下,子進程寫入“I am child”,但打印的結果顯示,兩個進程的內存區域是獨立的,不會受到影響。

有一點值得注意,那就是父子進程打印內存的地址都是一樣的但為什麼得到的數據確不一樣呢?其實,父子進程的地址空間是相互獨立的,兩個進程都會copy原始的數據,因此dada的值是一樣的,這個是個虛擬地址!須要經過映射變換得到實際的物理地址!!但由於父子進程此時擁有了各自獨立的進程空間,即使是同樣的虛擬地址,當映射到實際的物理內存時,也不會是同一個物理地址,所以不是同一個內存塊(物理上)!!!每個進程對同樣的虛擬地址映射結果是不同的。不能使用虛擬地址來做為判斷的依據。

Copyright © Linux教程網 All Rights Reserved