2011-09-29 8 views
8

Alguien aclare qué sucede con los punteros después de un tenedor().¿Qué sucede con los punteros a la memoria asignada dinámicamente después de una horquilla UNIX?

Según tengo entendido, los punteros a cualquier elemento de la pila o asignados estáticamente son relativos a los registros del segmento de pila/datos, por lo que copiarlos exactamente durante un fork está bien.

Sin embargo, ¿qué sucede si malloc() algo antes de bifurcar? por ejemplo:

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

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

posibilidades que estoy pensando:

  1. * p se copia en alguna otra parte del montón, p se actualiza para reflejar la ubicación que acaba de copiar.

  2. p todavía se refiere al original. si algún niño se ejecuta gratis (p); el padre no puede tener acceso a él.

  3. p sigue apuntando a los datos originales, pero el proceso secundario no tiene derechos para acceder a la memoria o administrarla.

¿cuál de estos, si corresponde, es el correcto?

+2

Los punteros aún apuntan a la misma dirección de memoria. Lo que se actualiza es el mapeo virtual. Puntero -> dirección virtual -> dirección física real. – jweyrich

+0

posible duplicado de [Hacer referencia a los punteros después de una llamada fork() en C] (http://stackoverflow.com/questions/4393933/referencing-pointers-after-a-fork-call-in-c) –

+1

duplicar de [Específicamente , ¿cómo maneja fork() la memoria dinámicamente asignada de malloc() en Linux?] (http://stackoverflow.com/questions/4597893/specifically-how-does-fork-handle-dynamically-allocated-memory-from-malloc -i) – IanNorton

Respuesta

12

Cuando se bifurcan, proceso hijo se convierte en una copia de su padre. Eso incluye cualquier memoria asignada dinámicamente. Entonces la memoria será copiada. La dirección del puntero se mantendrá igual (la copia no cambia los datos, ¿recuerdas?), Que se consigue al virtual addressing. No olvide llamar al free en los procesos padre e hijo.

+0

gracias. la parte de direccionamiento virtual es realmente lo que no entendí. – Dmitri

0

memoria Malloced proviene de la montón, que es sólo una palabra elegante para un conjunto de páginas de memoria. Desde fork() copia todas las páginas de memoria de un proceso independientemente de cualquier nombre elegante que se les haya dado en los libros de texto, los punteros devueltos por fork() funcionan bien en el niño :-)

Cuestiones relacionadas