看板 LinuxDev 關於我們 聯絡資訊
關於fork() , 書上是這麼寫的 : fork() 會產生一個新的子行程,該子行程會複製父行程的資料與堆疊空間, 並繼承父行程的使用者代碼,群組代碼,環境變數,已開啟的檔案代碼,工作目錄, 資源限制等. 由於這些繼承的資訊是複製來的,並非是相同的記憶空間,因此,子行程對這些 變數的修改和父行程並不會同步.此外子行不會繼承父行程的檔案鎖定和未處 理的訊號. 可是當我寫了一個程式驗證這個問題 發現父行程與子行程所使用的變數,記憶體位置印出來都相同 可是值的確是不一樣... 請問是我驗證的方法有問題呢? 還是觀念不對? 謝謝~ 參考程式碼如下: 5 int main() 6 { 7 int test = 0; 8 pid_t self,child; 9 10 child = fork(); 11 12 if(child == 0) 13 { 14 sleep(5); 15 test = 3; 16 printf("\nChild process, value = %d, &value = %p\n",test,&test); 17 } 18 else 19 { 20 test = 5; 21 printf("\nParent process, value= %d, &value = %p\n",test,&test); 22 wait(); 23 printf("\nParent process, value= %d, &value = %p\n",test,&test); 24 } 25 return 0; 26 } ========================================================================= 執行結果是這樣: Parent process, value = 5, &value = 0xbf92ca4c Child process, value = 3, &value = 0xbf92ca4c Parent process, value = 5, &value = 0xbf92ca4c -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.139.233.132
mayasky: usepspace 可以有重複的va,但分屬不同process 11/22 00:48
mayasky:你不都指出會有一樣的stack了?so~懂沒?@@ 11/22 00:50
SILee:virtual memory 11/22 01:00
itisjb:如果說到virtual memory那我就可以理解.... 11/22 01:02
itisjb:但stack的部份就不大能理解了...OS沒學好@@ 11/22 01:03
mayasky:address是多少? 11/22 03:09
(補充在上面) ※ 編輯: itisjb 來自: 114.32.9.209 (11/22 09:55)
mayasky:0xb開頭明顯是在stack中,書上不是說會複製stack? 11/22 12:38
mayasky:所以位置(va)一樣~但實質上在實體記憶體上是不一樣的 11/22 12:38
itisjb:了解...所以stack跟virtual memory的說法是一樣的摟? 11/22 12:50
mayasky:是~stack只是一段記憶體~終究還是virtual的 11/22 12:56
itisjb:那這樣我就知道了...謝謝^^ 11/22 13:19