2011-09-29 3 views
8

Quelqu'un s'il vous plaît clarifier ce qui se passe avec les pointeurs après une fourchette(). Si je comprends bien, les pointeurs vers tout ce qui est sur la pile ou alloués statiquement sont relatifs aux registres de la pile/du segment de données, donc les copier exactement pendant une bifurcation est OK.Qu'arrive-t-il aux pointeurs vers la mémoire allouée dynamiquement après une fourche UNIX?

Cependant, que se passe-t-il si je malloc() quelque chose avant de forking? par exemple:

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

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

Je pense à:

  1. * p est copié dans une autre partie du tas, p est mis à jour pour refléter l'emplacement nouvellement copié.

  2. p pointe toujours vers l'original. si un enfant est libre (p); le parent peut être incapable d'y accéder.

  3. p pointe toujours vers les données d'origine, mais le processus enfant n'a pas les droits d'accès/de gestion de la mémoire.

lesquels, s'il y en a, sont corrects?

+2

Les pointeurs pointent toujours vers la même adresse mémoire. Ce qui est mis à jour est le mappage virtuel. Pointeur -> adresse virtuelle -> adresse physique réelle. – jweyrich

+0

duplication possible de [Pointeurs de référence après un fork() appel en C] (http://stackoverflow.com/questions/4393933/referencing-pointers-after-a-fork-call-in-c) –

+1

duplicata de [Plus précisément , comment fork() gère-t-il la mémoire dynamiquement allouée depuis malloc() sous Linux?] (http://stackoverflow.com/questions/4597893/specifically-how-does-fork-handle-dynamically-allocated-memory-from-malloc -i) – IanNorton

Répondre

12

Quand bifurquer, processus enfant devient une copie de son parent. Cela inclut toute mémoire allouée dynamiquement. Ainsi, la mémoire sera copiée. L'adresse du pointeur restera la même (la copie ne change pas les données, souvenez-vous?), Qui est atteinte par virtual addressing. N'oubliez pas d'appeler le free dans les processus parent et enfant.

+0

merci. la partie d'adressage virtuel est vraiment ce que je n'ai pas compris. – Dmitri

0

mémoire Malloced vient du tas, qui est juste un mot de fantaisie pour un ensemble de pages de mémoire. Puisque fork() copie toutes les pages de mémoire d'un processus, quel que soit le nom de fantaisie donné dans les manuels, les pointeurs renvoyés par fork() fonctionnent très bien dans l'enfant :-)

Questions connexes