我有一个带有父进程和子进程的程序.在fork()之前,父进程调用malloc()并用一些数据填充array.在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中总是这样吗?如果是,支持这一点的文档在哪里?我查看了fork()手册页,但没有特别提到堆上的动态分配内存.