2011-09-29 13 views
8

Qualcuno si prega di chiarire cosa succede con i puntatori dopo un fork().cosa succede ai puntatori alla memoria allocata dinamicamente dopo un fork UNIX?

Come ho capito, i puntatori a qualsiasi cosa sullo stack o allocati staticamente sono relativi ai registri stack/data segment, quindi copiarli esattamente durante un fork è OK.

Tuttavia, cosa succede se malloc() qualcosa prima di biforcarsi? per esempio:

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

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

possibilità Sto pensando di:

  1. * p viene copiato qualche altra parte del mucchio, p viene aggiornato per riflettere la posizione appena copiato.

  2. p fa ancora riferimento all'originale. se un bambino corre libero (p); il genitore potrebbe non essere in grado di accedervi.

  3. p punta ancora ai dati originali, ma il processo figlio non dispone dei diritti per accedere/gestire la memoria.

quale di questi, se presente, è corretto?

+2

I puntatori puntano ancora allo stesso indirizzo di memoria. Ciò che viene aggiornato è la mappatura virtuale. Puntatore -> indirizzo virtuale -> indirizzo fisico reale. – jweyrich

+0

possibile duplicato di [Puntatori di riferimento dopo una chiamata a fork() in C] (http://stackoverflow.com/questions/4393933/referencing-pointers-after-a-fork-call-in-c) –

+1

duplicato di [Specificamente , in che modo fork() gestisce la memoria allocata dinamicamente da malloc() in Linux?] (http://stackoverflow.com/questions/4597893/specifically-how-does-fork-handle-dynamically-allocated-memory-from-malloc -i) – IanNorton

risposta

12

Quando si biforcano, processo bambino diventa una copia del suo genitore. Ciò include qualsiasi memoria allocata dinamicamente. Quindi la memoria verrà copiata. L'indirizzo del puntatore rimarrà lo stesso (la copia non cambia i dati, ricordi?), Che viene raggiunto da virtual addressing. Non dimenticare di chiamare free in entrambi i processi padre e figlio.

+0

grazie. la parte di indirizzamento virtuale è davvero ciò che non ho capito. – Dmitri

0

memoria Malloced viene dal mucchio, che è solo una parola di fantasia per una serie di pagine di memoria. Poiché fork() copia tutte le pagine di memoria di un processo a prescindere dalla denominazione di fantasia fornita nei libri di testo, i puntatori restituiti da fork() funzionano correttamente nel bambino :-)

Problemi correlati