1. 程式人生 > >linux的fork()函數具體解釋 子進程復制父進程什麽

linux的fork()函數具體解釋 子進程復制父進程什麽

gin font sso main stdlib.h eight imp size cpp

  1. #include<stdio.h>??
  2. #include<string.h>??
  3. #include<stdlib.h>??
  4. #include<unistd.h>??
  5. ??
  6. void?main()??
  7. {??
  8. ????char?str[6]="hello";??
  9. ??
  10. ????pid_t?pid=fork();??
  11. ??
  12. ????if(pid==0)??
  13. ????{??
  14. ????????str[0]=‘b‘;??
  15. ????????printf("子進程中str=%s\n"
    ,str);??
  16. ????????printf("子進程中str指向的首地址:%x\n",(unsigned?int)str);??
  17. ????}??
  18. ????else??
  19. ????{??
  20. ????????sleep(1);??
  21. ????????printf("父進程中str=%s\n",str);??
  22. ????????printf("父進程中str指向的首地址:%x\n",(unsigned?int)str);??
  23. ????}??
  24. }??
子進程中str=bello
子進程中str指向的首地址:bfdbfc06 ??這裏取的是虛擬地址
父進程中str=hello

父進程中str指向的首地址:bfdbfc06 ?

這裏取的是虛擬地址


解釋:採用“寫拷貝技術”,剛fork時候,子進程沒有改動數據段的值。則子進程和父進程全部代碼共享,同樣的物理地址。同樣的虛擬地址,

當子進程改動某個變量時候,這個變量才真正復制到子進程,擁有自己的物理地址。可是虛擬地址還是一樣,兩個同樣的虛擬地址指向的是不同的物理地址。

所以出現上面的答案。


這裏虛擬地址同樣 ? 可是物理地址不一樣





linux的fork()函數具體解釋 子進程復制父進程什麽