2011-09-29 2 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

[ fork()は、Linuxのmalloc()から動的に割り当てられたメモリをどう扱うのですか?](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()によって返されるポインタは子プロセスで正常に動作します:-)

関連する問題