C 在UNIX分叉之后,指向动态分配内存的指针会发生什么情况?

C 在UNIX分叉之后,指向动态分配内存的指针会发生什么情况?,c,unix,fork,C,Unix,Fork,请有人澄清fork()之后指针会发生什么 据我所知,指向堆栈上任何内容或静态分配的指针都是相对于堆栈/数据段寄存器的,因此在fork期间精确复制它们是可以的 但是,如果我在分叉之前调用malloc(),会发生什么?例如: void* p = malloc(64); // put something in *p; fork(); // what happens to p and the memory i allocated here? 我正在考虑的可能性: *p被复制到堆的其他部分,p被更新以

请有人澄清fork()之后指针会发生什么

据我所知,指向堆栈上任何内容或静态分配的指针都是相对于堆栈/数据段寄存器的,因此在fork期间精确复制它们是可以的

但是,如果我在分叉之前调用malloc(),会发生什么?例如:

void* p = malloc(64);
// put something in *p;
fork();

// what happens to p and the memory i allocated here?
我正在考虑的可能性:

  • *p被复制到堆的其他部分,p被更新以反映新复制的位置

  • p仍然指向原文。如果有儿童自由奔跑(p);父级可能无法访问它

  • p仍然指向原始数据,但子进程没有访问/管理内存的权限


  • 以下哪一项(如果有)是正确的?

    值也会被复制,因为fork会复制代码、全局变量、堆和堆栈


    来源:

    分叉时,子进程成为其父进程的副本。它包括任何动态分配的内存。因此,内存将被复制。指针地址将保持不变(复制不会更改数据,还记得吗?),这是由实现的。不要忘了在父进程和子进程中调用
    free

    Malloced内存来自,这只是一组内存页的一个花哨词。由于
    fork()
    复制一个进程的所有内存页,而不考虑教科书中给出的任何奇特的命名,因此fork()返回的指针在子进程中工作得很好:-)

    指针仍然指向相同的内存地址。更新的是虚拟映射。指针->虚拟地址->实际物理地址。可能重复感谢的副本。虚拟寻址部分确实是我不理解的。