linux的fork()函數具體解釋 子進程復制父進程什麽
阿新 • • 發佈:2018-04-11
gin font sso main stdlib.h eight imp size cpp
子進程中str指向的首地址:bfdbfc06 ??這裏取的是虛擬地址
父進程中str=hello
這裏取的是虛擬地址
- #include<stdio.h>??
- #include<string.h>??
- #include<stdlib.h>??
- #include<unistd.h>??
- ??
- void?main()??
- {??
- ????char?str[6]="hello";??
- ??
- ????pid_t?pid=fork();??
- ??
- ????if(pid==0)??
- ????{??
- ????????str[0]=‘b‘;??
-
????????printf("子進程中str=%s\n"
- ????????printf("子進程中str指向的首地址:%x\n",(unsigned?int)str);??
- ????}??
- ????else??
- ????{??
- ????????sleep(1);??
- ????????printf("父進程中str=%s\n",str);??
- ????????printf("父進程中str指向的首地址:%x\n",(unsigned?int)str);??
- ????}??
- }??
子進程中str指向的首地址:bfdbfc06 ??這裏取的是虛擬地址
父進程中str=hello
父進程中str指向的首地址:bfdbfc06 ?
解釋:採用“寫拷貝技術”,剛fork時候,子進程沒有改動數據段的值。則子進程和父進程全部代碼共享,同樣的物理地址。同樣的虛擬地址,
當子進程改動某個變量時候,這個變量才真正復制到子進程,擁有自己的物理地址。可是虛擬地址還是一樣,兩個同樣的虛擬地址指向的是不同的物理地址。
所以出現上面的答案。
這裏虛擬地址同樣 ? 可是物理地址不一樣
linux的fork()函數具體解釋 子進程復制父進程什麽