c - UNIX fork 后指向动态分配内存的指针会发生什么变化?

标签 c unix fork

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

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

但是,如果我在 fork 之前 malloc() 一些东西会发生什么?例如:

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

// what happens to p and the memory i allocated here?

我想到的可能性:

  1. *p 被复制到堆的其他部分,p 被更新以反射(reflect)新复制的位置。

  2. p 仍然指向原来的。如果有 child 自由奔跑(p);家长可能无法访问它。

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

如果有的话,哪一个是正确的?

最佳答案

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

关于c - UNIX fork 后指向动态分配内存的指针会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601146/

相关文章:

image - ImageMagick可以返回图像大小吗?

c - 如何获得最快的数据处理方式: fork or/and multithreading

c - 子进程会在 abort() 上发送 SIGCHLD 吗?

C:运行系统命令并获取输出?

c - 在linux中获取文件的最后修改时间

C - 矩阵表示为链表

c - 如何在 C 中用另一个数组移动字符位置?

linux - 在 SFTP 时运行 Nohup

linux - zsh 参数扩展语法 : combining default value and conversion to upper case

c - kill会被一个信号打断吗?