gpt4 book ai didi

c - 具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?

转载 作者:IT老高 更新时间:2023-10-28 12:40:16 26 4
gpt4 key购买 nike

我有一个包含父进程和子进程的程序。在 fork() 之前,父进程调用 malloc() 并用一些数据填充了一个数组。在 fork() 之后, child 需要该数据。我知道我可以使用管道,但以下代码似乎可以工作:

#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

我知道在堆栈上分配的数据在子进程中可用,但在堆上分配的数据似乎也对子进程可用。同样,子进程不能修改父进程栈上的数据,子进程也不能修改父进程堆上的数据。所以我假设 child 获得了自己的堆栈和堆数据副本。

在 Linux 中总是这样吗?如果是这样,支持这一点的文档在哪里?我查看了 fork() 手册页,但没有特别提到堆上动态分配的内存。

最佳答案

为进程分配的每个页面(无论是上面有堆栈的虚拟内存页面还是堆)都会被复制,以便 fork 的进程能够访问它。

实际上,它并没有在一开始就被复制,它被设置为 Copy-on-Write,这意味着一旦某个进程(父进程或子进程)尝试修改一个页面,它就会被复制,这样它们就不会伤害一个进程-another,并且仍然可以访问来自 fork() 点的所有数据。

例如,代码页,即实际可执行文件映射到内存中的代码页,通常是只读的,因此会在所有 fork 的进程中重用——它们不会被再次复制,因为没有人在那里写,只有读,因此永远不需要写时复制。

更多信息可用herehere .

关于c - 具体来说,fork() 如何处理 Linux 中 malloc() 动态分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4597893/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com