今天遇到一個這樣的問題,假設父進程有一個變數S,fork後,子進程中的變數S地址是否和父進程中的變數S 是相同的? 再學操作系統的時候,知道fork是採用的寫時複製,所以如果子進程或者父進程不對變數S做修改的話,它們應該 是指向同一塊物理記憶體,如果有修改,那麼它們會指向不同的物理記憶體,但虛擬記憶體地址 ...
今天遇到一個這樣的問題,假設父進程有一個變數S,fork後,子進程中的變數S地址是否和父進程中的變數S
是相同的?
再學操作系統的時候,知道fork是採用的寫時複製,所以如果子進程或者父進程不對變數S做修改的話,它們應該
是指向同一塊物理記憶體,如果有修改,那麼它們會指向不同的物理記憶體,但虛擬記憶體地址還是相同的,所以在子進程中
輸出&S和在父進程中輸出&S,結果是一樣的。
下麵補充兩個程式的運行結果:
#include "stdio.h" #include "unistd.h" int main() { int s=5; if(fork()==0) { //s+=5; printf("child: %d %x\n",s,&s); } else { //s-=5; printf("parent: %d %x\n",s,&s); } return 0; }
運行結果:
上面的代碼並未修改s的值,下麵的代碼修改了s的值,此時再測試
#include "stdio.h" #include "unistd.h" int main() { int s=5; if(fork()==0) { s+=5; printf("child: %d %x\n",s,&s); } else { s-=5; printf("parent: %d %x\n",s,&s); } return 0; }
運行結果: