У меня есть программа с родительским и дочерним процессом. Перед fork() родительский процесс называется malloc() и заполняет массив некоторыми данными. После fork() ребенку нужны эти данные. Я знаю, что могу использовать трубку, но следующий код работает:
#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;
}
Вывод:
Parent array: Hello
Child array: Hello
Child array: Goodbye
Parent array: Hello
Я знаю, что данные, выделенные в стеке, доступны в дочернем элементе, но кажется, что данные, выделенные в куче, также доступны для дочернего элемента. Аналогичным образом, ребенок не может изменять родительские данные в стеке, ребенок не может изменять родительские данные в куче. Поэтому я полагаю, что у ребенка есть своя копия данных стека и кучи.
Это всегда так в Linux? Если да, то где это документация, которая поддерживает это? Я проверил man-страницу fork(), но в ней особо не упоминалось динамически выделенная память в куче.
Спасибо