2011-09-29 25 views
8

有人請澄清一下fork()後指針發生了什麼。在UNIX分支之後,指向動態分配內存的指針會發生什麼?

據我所知,指向堆棧上或靜態分配的任何東西都是相對於堆棧/數據段寄存器的,所以在fork中準確地複製它們是可以的。

但是,如果我malloc()之前的東西分叉會發生什麼?例如:

void* p = malloc(64); 
// put something in *p; 
fork(); 

// what happens to p and the memory i allocated here? 

可能性我想到的是:

  1. * p被複制到堆的其它部分,p被更新,以反映新複製的位置。

  2. p仍然指向原來的。如果有任何孩子免費(p);父母可能無法訪問它。

  3. p仍指向原始數據,但子進程沒有訪問/管理內存的權限。

其中哪些,如果有的話,是正確的?

+2

指針仍然指向相同的內存地址。更新的是虛擬映射。指針 - >虛擬地址 - >真實物理地址。 – jweyrich

+0

[在C]中調用fork()後引用指針的可能重複(http://stackoverflow.com/questions/4393933/referencing-pointers-after-a-fork-call-in-c) –

+1

[Specific ,fork()如何處理從malloc()在Linux中動態分配內存?](http://stackoverflow.com/questions/4597893/specifically-how-does-fork-handle-dynamically-allocated-memory-from-malloc -i) – IanNorton

回答

12

分叉時,子進程將成爲其父副本。這包括任何動態分配的內存。所以內存將被複制。指針地址將保持不變(複製不會改變數據,請記住?),這是通過virtual addressing實現的。不要忘記在父母和子女的過程中撥打free

+0

謝謝。虛擬尋址部分真的是我不明白的地方。 – Dmitri

0

malloc內存來自,這僅僅是一組內存頁面看中了字。由於fork()複製了一個進程的所有內存頁面,而不管它們在教科書中給出了什麼樣的花哨命名,所以fork()返回的指針在子代中工作得很好:-)

相關問題