Ich habe ein Programm mit einem übergeordneten und einem untergeordneten Prozess. Vor dem fork() rief der Elternprozess malloc() auf und füllte ein Array mit einigen Daten. Nach dem fork() benötigt der Kindprozess diese Daten. Ich weiß, dass ich eine Pipe verwenden könnte, aber der folgende Code scheint zu funktionieren:
#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;
}
Die Ausgabe ist:
Parent array: Hello
Child array: Hello
Child array: Goodbye
Parent array: Hello
Ich weiß, dass auf dem Stack zugewiesene Daten im Child verfügbar sind, aber es scheint, dass auf dem Heap zugewiesene Daten auch für das Child verfügbar sind. Und ebenso kann das Kind die Daten des Elternteils auf dem Stack nicht ändern, und das Kind kann die Daten des Elternteils auf dem Heap nicht ändern. Ich nehme also an, dass das Kind seine eigene Kopie der Stack- und Heap-Daten erhält.
Ist dies bei Linux immer der Fall? Wenn ja, wo ist die Dokumentation, die dies unterstützt? Ich habe in der fork()-Manualseite nachgesehen, aber dort wird dynamisch zugewiesener Speicher auf dem Heap nicht ausdrücklich erwähnt.