有人请澄清在 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 被更新以反射(reflect)新复制的位置。
p 仍然指向原来的。如果有 child 自由奔跑(p);家长可能无法访问它。
p仍然指向原始数据,但是子进程没有访问/管理内存的权限。
如果有的话,哪一个是正确的?
最佳答案
fork 时,子进程成为其父进程的副本。这包括任何动态分配的内存。所以内存会被复制。指针地址将保持不变(复制不会更改数据,还记得吗?),这是通过 virtual addressing 实现的.不要忘记在父进程和子进程中调用 free
。
关于c - UNIX fork 后指向动态分配内存的指针会发生什么变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7601146/