C 在UNIX分叉之后,指向动态分配内存的指针会发生什么情况?
请有人澄清fork()之后指针会发生什么 据我所知,指向堆栈上任何内容或静态分配的指针都是相对于堆栈/数据段寄存器的,因此在fork期间精确复制它们是可以的 但是,如果我在分叉之前调用malloc(),会发生什么?例如: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被更新以
void* p = malloc(64);
// put something in *p;
fork();
// what happens to p and the memory i allocated here?
我正在考虑的可能性:
以下哪一项(如果有)是正确的?值也会被复制,因为fork会复制代码、全局变量、堆和堆栈
来源:分叉时,子进程成为其父进程的副本。它包括任何动态分配的内存。因此,内存将被复制。指针地址将保持不变(复制不会更改数据,还记得吗?),这是由实现的。不要忘了在父进程和子进程中调用
free
。Malloced内存来自堆,这只是一组内存页的一个花哨词。由于fork()
复制一个进程的所有内存页,而不考虑教科书中给出的任何奇特的命名,因此fork()返回的指针在子进程中工作得很好:-)指针仍然指向相同的内存地址。更新的是虚拟映射。指针->虚拟地址->实际物理地址。可能重复感谢的副本。虚拟寻址部分确实是我不理解的。