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

标签 c linux malloc fork heap-memory

我有一个包含父进程和子进程的程序。在 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/

相关文章:

c - 在函数内部传递内存分配指针?

c - 将文件中的数字以 6 为一组读取到 2x3 矩阵中?

c - 双击可执行文件时无法打开文件

c++ - c.vim c/c++ 插件把函数的返回值放在函数上面,可以吗?

linux - 在 Yocto Tree 中使用预建工具链

linux - 如何使用awk/sed增加文件中数字的匹配模式?

php - PDO 准备好的语句导致 SIGABRT

c - 段错误(在kali中使用gcc)

Linux 等效于 Mac OS X "open"命令

c - 为什么使用 malloc?