Tengo un programa con un proceso principal y uno secundario. Antes de la bifurcación(), el proceso principal se llamaba malloc() y rellenaba una matriz con algunos datos. Después de la bifurcación(), el niño necesita esa información. Sé que podría utilizar un tubo, pero el siguiente código parece funcionar:Específicamente, ¿cómo tenedor() maneja la memoria dinámicamente asignada de malloc() en Linux?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
char *array;
array = malloc(20);
strcpy(array, "Hello");
switch(fork()) {
case 0:
printf("Child array: %s\n", array);
strcpy(array, "Goodbye");
printf("Child array: %s\n", array);
free(array);
break;
case -1:
printf("Error with fork()\n");
break;
default:
printf("Parent array: %s\n", array);
sleep(1);
printf("Parent array: %s\n", array);
free(array);
}
return 0;
}
La salida es:
Parent array: Hello
Child array: Hello
Child array: Goodbye
Parent array: Hello
Sé que los datos asignados en la pila está disponible en el niño, pero parece que los datos asignados en el montón también están disponibles para el niño. Y de manera similar, el niño no puede modificar los datos de los padres en la pila, el niño no puede modificar los datos de los padres en el montón. Así que supongo que el niño obtiene su propia copia de datos de pila y montón.
¿Este es siempre el caso en Linux? Si es así, ¿dónde está la documentación que lo respalda? Comprobé la página man de fork(), pero no mencionó específicamente la memoria asignada dinámicamente en el montón.
Gracias
Para que quede claro, hay * condición * de carrera en el código del OP, ¿correcto? – SiegeX
No puede haber, los procesos ya no se pueden comunicar usando esta memoria. – abyx
Nitpick: considere 'mmap (MAP_SHARED)' y 'shmat'. Que está fuera del alcance de "stack" y "heap" de C, pero dijiste "cada página" ... – ephemient