【发布时间】:2011-06-03 15:07:42
【问题描述】:
我有一个包含父进程和子进程的程序。在 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 中总是这样吗?如果是这样,支持这一点的文档在哪里?我查看了 fork() 手册页,但没有特别提到堆上动态分配的内存。
【问题讨论】:
标签: c linux malloc fork heap-memory