具体来说,fork()如何处理Linux中malloc()的动态分配内存?
我有一个带有父进程和子进程的程序。在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: HelloChild array: Hello
Child array: Goodbye
Parent array: Hello
我知道在子级中可以使用在堆栈上分配的数据,但是似乎在子级中也可以使用在堆上分配的数据。同样,子代不能修改堆栈上父代的数据,子代不能修改堆上父代的数据。因此,我假设孩子获得了自己的堆栈和堆数据副本。
Linux总是这样吗?如果是这样,支持此操作的文档在哪里?我检查了fork()手册页,但没有特别提及堆上动态分配的内存。
谢谢
回答:
复制为该进程分配的每个页面(它是具有堆栈或堆的虚拟内存页面),以便派生的进程能够访问它。
实际上,它并非一开始就被复制,而是将其设置为“写时复制”,这意味着一旦其中一个进程(父级或子级)尝试修改要复制的页面,这样它们就不会对彼此造成伤害,并且仍然可以访问fork()处的所有数据。
例如,将实际可执行文件映射到内存中的代码页通常是只读的,因此会在所有分叉的进程中重用-
它们将不会再次被复制,因为没有人在此处写,只能读等等。不再需要写时复制。
可在此处和此处获得更多信息。
以上是 具体来说,fork()如何处理Linux中malloc()的动态分配内存? 的全部内容, 来源链接: utcz.com/qa/407553.html