作者itisjb (J.B)
看板LinuxDev
標題[問題] 請問關於fork的問題
時間Sun Nov 22 00:30:36 2009
關於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
1F:→ mayasky: usepspace 可以有重複的va,但分屬不同process 11/22 00:48
2F:→ mayasky:你不都指出會有一樣的stack了?so~懂沒?@@ 11/22 00:50
3F:→ SILee:virtual memory 11/22 01:00
4F:→ itisjb:如果說到virtual memory那我就可以理解.... 11/22 01:02
5F:→ itisjb:但stack的部份就不大能理解了...OS沒學好@@ 11/22 01:03
6F:→ mayasky:address是多少? 11/22 03:09
(補充在上面)
※ 編輯: itisjb 來自: 114.32.9.209 (11/22 09:55)
7F:→ mayasky:0xb開頭明顯是在stack中,書上不是說會複製stack? 11/22 12:38
8F:→ mayasky:所以位置(va)一樣~但實質上在實體記憶體上是不一樣的 11/22 12:38
9F:→ itisjb:了解...所以stack跟virtual memory的說法是一樣的摟? 11/22 12:50
10F:→ mayasky:是~stack只是一段記憶體~終究還是virtual的 11/22 12:56
11F:→ itisjb:那這樣我就知道了...謝謝^^ 11/22 13:19