有人请说明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仍指向原始数据,但子进程无权访问/管理内存。
其中哪一项(如果有的话)是正确的?
答案 0 :(得分:13)
分叉时,子进程变为其父进程的副本。这包括任何动态分配的内存。所以内存将被复制。指针地址将保持不变(复制不会更改数据,还记得?),这是由virtual addressing实现的。不要忘记在父进程和子进程中调用free
。
答案 1 :(得分:3)
该值也被复制,因为fork复制代码,全局,堆和堆栈。
来源:http://web.eecs.utk.edu/~huangj/cs360/360/notes/Fork/lecture.html
答案 2 :(得分:1)
Malloced内存来自堆,这只是一组内存页的一个奇特的词。由于fork()
复制了进程的所有内存页面,而不管教科书中是否有任何花哨的命名,fork()返回的指针在子进程中运行得很好: - )